hdu4745Two Rabbits(dp)

时间:2023-03-09 17:29:02
hdu4745Two Rabbits(dp)

链接

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

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

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

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int dp[][];
int a[];
int main()
{
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
memset(dp,,sizeof(dp));
for(i = ; i <= n ; i++)
{
scanf("%d",&a[i]);
dp[i][i] = ;
}
for(i = n ; i >= ;i--)
{
for(j = i+; j <= n ; j++)
{
if(a[i]==a[j])
dp[i][j] = dp[i+][j-]+;
dp[i][j] = max(dp[i][j],max(dp[i+][j],dp[i][j-]));
}
}
int ans=;
for(i = ; i < n ; i++)
ans = max(ans,dp[][i]+dp[i+][n]);
printf("%d\n",ans);
}
return ;
}