E2. Three Blocks Palindrome (hard version) (贪心&暴力)

题目传送门

思路:

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t,n;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		vector<vector<int> >a(201,vector<int>(n+1));
		vector<vector<int> >p(201);//储存每个数的位置. 
		for(int i=1,x;i<=n;i++)
		{
			scanf("%d",&x);
			for(int j=1;j<=200;j++) //前缀和 
				a[j][i]=a[j][i-1]+(x==j);
			p[x].push_back(i);
		}
		int ans=0;
		for(int k=1;k<=200;k++){ //O(n*200*200) 
				ans=max(ans,(int)p[k].size());//如果只取一个子串. 
			for(int i=1;i<=(p[k].size()/2);i++)//左右对称贪心思想. 
			{
				  int l=p[k][i-1]+1,r=p[k][p[k].size()-i]-1;//找到区间[l , r] 
				  for(int j=1;j<=200;j++) //取最大值. 
				  {
				  		int x=a[j][r]-a[j][l-1];
				  		ans=max(ans,i*2+x);
				  }
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}