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

 

你可能感兴趣的:(HDU)