题目链接:HDU - 6570
暴力的话就是枚举两种颜色,然后暴力求。因为不可能每一种情况都跑满,均摊下来感觉复杂度是:O(ccsqrt(n))。
事实上我们可以O(n*c)dp,令dp[i][j][k] 为:第i项为k,前面的一个颜色为j的最大长度。
然后就可以从 前面的 dp[x][k][j] 转移过来。但是复杂度太高了,并且我们可以注意到第一个状态是没必要的,可以直接优化掉。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,c,dp[110][110],res;
inline void solve(){res=0; memset(dp,0,sizeof dp);for(int i=1,x;i<=n;i++){scanf("%d",&x);for(int j=1;j<=c;j++) if(j!=x){dp[j][x]=dp[x][j]+1;res=max(res,dp[j][x]);}}printf("%d\n",res);
}
signed main(){while(cin>>n>>c) solve();return 0;
}