Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 505 Accepted Submission(s): 260
答案竟然就是分成两部分以后的最长回文子串,
太难想到了,TAT
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013/9/15 星期日 15:20:03 4 File Name :2013杭州网络赛\1008.cpp 5 ************************************************ */ 6 7 #pragma comment(linker, "/STACK:1024000000,1024000000") 8 #include <stdio.h> 9 #include <string.h> 10 #include <iostream> 11 #include <algorithm> 12 #include <vector> 13 #include <queue> 14 #include <set> 15 #include <map> 16 #include <string> 17 #include <math.h> 18 #include <stdlib.h> 19 #include <time.h> 20 using namespace std; 21 #define REP(I, N) for (int I=0;I<int(N);++I) 22 #define FOR(I, A, B) for (int I=int(A);I<int(B);++I) 23 #define DWN(I, B, A) for (int I=int(B-1);I>=int(A);--I) 24 #define REP_1(I, N) for (int I=1;I<=int(N);++I) 25 #define FOR_1(I, A, B) for (int I=int(A);I<=int(B);++I) 26 #define DWN_1(I, B, A) for (int I=int(B);I>=int(A);--I) 27 #define REP_C(I, N) for (int N____=int(N),I=0;I<N____;++I) 28 #define FOR_C(I, A, B) for (int B____=int(B),I=A;I<B____;++I) 29 #define DWN_C(I, B, A) for (int A____=int(A),I=B-1;I>=A____;--I) 30 #define REP_1_C(I, N) for (int N____=int(N),I=1;I<=N____;++I) 31 #define FOR_1_C(I, A, B) for (int B____=int(B),I=A;I<=B____;++I) 32 #define DWN_1_C(I, B, A) for (int A____=int(A),I=B;I>=A____;--I) 33 #define DO(N) while(N--) 34 #define DO_C(N) int N____ = N; while(N____--) 35 #define TO(i, a, b) int s_=a<b?1:-1,b_=b+s_;for(int i=a;i!=b_;i+=s_) 36 #define TO_1(i, a, b) int s_=a<b?1:-1,b_=b;for(int i=a;i!=b_;i+=s_) 37 #define SQZ(I, J, A, B) for (int I=int(A),J=int(B)-1;I<J;++I,--J) 38 #define SQZ_1(I, J, A, B) for (int I=int(A),J=int(B);I<=J;++I,--J) 39 40 const int MAXN = 1010; 41 int a[MAXN]; 42 int dp[MAXN][MAXN]; 43 int main() 44 { 45 //freopen("in.txt","r",stdin); 46 //freopen("out.txt","w",stdout); 47 int n; 48 while(scanf("%d",&n) ==1 && n) 49 { 50 for(int i = 1;i <= n;i++) 51 scanf("%d",&a[i]); 52 memset(dp,0,sizeof(dp)); 53 for(int i = 1;i <= n;i++)dp[i][i] = 1; 54 for(int k = 1;k <= n;k++) 55 for(int i = 1;i + k <= n;i++) 56 { 57 dp[i][i+k] = max(dp[i+1][i+k],dp[i][i+k-1]); 58 if(a[i] == a[i+k])dp[i][i+k] = max(dp[i][i+k],2+dp[i+1][i+k-1]); 59 } 60 int ans = 0; 61 for(int i = 1;i <= n;i++) 62 ans = max(ans,dp[1][i]+dp[i+1][n]); 63 printf("%d\n",ans); 64 } 65 return 0; 66 }