hdu4745Two Rabbits(dp)

链接

哎。。比赛中一下想到了公共子序 之后思维就被局限了 一直在这附近徘徊 想着怎么优化 怎么预处理。。

观看了众多神牛的代码 。。以前觉得自己能写出个记忆化的最长回文长度 还挺高兴的。。。现在觉得好弱

因为它是两边一起跑 也就是可以是两段回文子序 所以。。只需要求下1-i i+1-n的最长回文串就可以了 这个是可以在之前求总的时候保留下来的

 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 }
View Code

 

posted @ 2013-09-16 11:45 _雨 阅读(...) 评论(...) 编辑 收藏