这题一开始我想的是n2,然后发现a[i]的最大值为10,与之前暴力dp相结合。
设置一个桶为t[i][j]代表下在i处的j颜色所代表的最大步数。
那么dp[i]=max(dp[i],t[a[i].second][!a[i].first])
#include<bits/stdc++.h> using namespace std; #define ll long long const ll mod=1e9+7; const int N=2e5; void solve() { int n; cin>>n; vector<pair<int,int>>a(n+1); vector<int>dp(n+1); for(int i=1;i<=n;++i) dp[i]=1; for(int i=1;i<=n;++i) cin>>a[i].first>>a[i].second; vector<vector<int>>t(11,vector<int>(2)); dp[1]=1,t[a[1].second][a[1].first]++; for(int i=2;i<=n;++i){ for(int j=1;j<=10;++j){ if(a[i].second==j) continue; dp[i]=max(dp[i],t[j][!a[i].first]+1); } t[a[i].second][a[i].first]=max(t[a[i].second][a[i].first],dp[i]); } int ma=0; for(int i=1;i<=n;++i) ma=max(ma,dp[i]); cout<<ma<<'\n'; } int main() { cin.tie(nullptr)->sync_with_stdio(false); int t; cin>>t; //cin>>t; while (t--) { solve(); } }