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