/*题意:就是给定n个环状的数 俩个人一个从顺时针 一个从逆时针 但是他们走的都要是在相等的数值上面
但是他们只能往前走 问他们能这样走多少步*/
/*思路:题意他么理解了好一会 就是一直往前走 不能回头或者不走 因为是一个环,在区间上去最优解就ok*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<int,int> pp;
#define inf 0x3f3f3f3f
#define eps 1e-10
#define maxl 1010
#define mem(i,j) memset(i,j,sizeof(i))
const int mod=1e9+7;
int v[maxl];
int d[maxl][maxl];//区间i~j里面的最长回文子串的长度
int main()
{
freopen("in.txt", "r", stdin);
int n;
while(cin>>n&&n){
memset(d,0,sizeof(d));
for(int i=0;i<n;i++) {d[i][i]=1;cin>>v[i];}
for(int i=n-1;i>=0;i--){//这里就是预处理i~j里面的最长回文串的长度 直接求出来就好了 都没有区间DP的感觉
for(int j=i+1;j<n;j++){
d[i][j]=max(d[i][j],max(d[i+1][j],d[i][j-1]));
if(v[i]==v[j]) d[i][j]=max(d[i][j],d[i+1][j-1]+2);
}
}
int ans=0;
for(int i=0;i<n;i++){
ans=max(ans,d[0][i]+d[i+1][n-1]);//0~i-1 i~n-1,A可以从i-1走到0,然后从n走到i,B可以从0走到i-1,从i走到n-1 .
//cout<<d[0][i]<<' '<<d[i+1][n-1]<<endl;
}
cout<<ans<<endl;
}
}
hdu 4745 区间回文最长长度
最新推荐文章于 2021-10-10 09:55:45 发布