这题一开始我想的是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();
}
}

京公网安备 11010502036488号