hdu4745Two Rabbits(dp)
哎。。比赛中一下想到了公共子序 之后思维就被局限了 一直在这附近徘徊 想着怎么优化 怎么预处理。。
观看了众多神牛的代码 。。以前觉得自己能写出个记忆化的最长回文长度 还挺高兴的。。。现在觉得好弱
因为它是两边一起跑 也就是可以是两段回文子序 所以。。只需要求下1-i i+1-n的最长回文串就可以了 这个是可以在之前求总的时候保留下来的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 int dp[1010][1010]; 8 int a[1010]; 9 int main() 10 { 11 int i,j,n; 12 while(scanf("%d",&n)!=EOF) 13 { 14 if(!n) break; 15 memset(dp,0,sizeof(dp)); 16 for(i = 1; i <= n ; i++) 17 { 18 scanf("%d",&a[i]); 19 dp[i][i] = 1; 20 } 21 for(i = n ; i >= 1 ;i--) 22 { 23 for(j = i+1; j <= n ; j++) 24 { 25 if(a[i]==a[j]) 26 dp[i][j] = dp[i+1][j-1]+2; 27 dp[i][j] = max(dp[i][j],max(dp[i+1][j],dp[i][j-1])); 28 } 29 } 30 int ans=1; 31 for(i = 1; i < n ; i++) 32 ans = max(ans,dp[1][i]+dp[i+1][n]); 33 printf("%d\n",ans); 34 } 35 return 0; 36 }