HDU 4753 Two Rabbits(区间DP)

来源:互联网 发布:手机淘宝怎么搜索达人 编辑:程序博客网 时间:2024/04/28 19:06

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4745

这个题目比赛时没出,对不起队友!

其实就是求最长回文子系列,最后枚举一个兔子的出发点就可以了,另一个兔子在左边的回文子系列的中心

接下来就是求回文子系列的长度dp[i][j]表示串从i到j的最长回文字系列的长度

#include <string.h>#include <algorithm>#include <stdio.h>#include <iostream>using namespace std;#define maxn 1005int n,rec[maxn];int dp[maxn][maxn];#define MAX(a,b) (a>b?a:b)int Dp(){    int i,j,k,a,b,c,ans=0;    for(i=0;i<n;i++) dp[i][i]=1;    for(i=1;i<n;i++)    for(j=0;j<n && i+j<n;j++){        if(i==1){            if(rec[j]==rec[i+j]) dp[j][i+j]=2;            else dp[j][i+j]=1;            continue;        }        dp[j][i+j]=MAX(dp[j][i+j-1],dp[j+1][j+i]);        if(rec[j]==rec[i+j]) dp[j][i+j]=MAX(dp[j][i+j],dp[j+1][i+j-1]+2);    }    for(i=0;i<n;i++)    ans=MAX(dp[0][i]+dp[i+1][n-1],ans);    printf("%d\n",ans);    return 0;}int main(){    int i,j,k;    while(scanf("%d",&n),n){        for(i=0;i<n;i++) scanf("%d",&rec[i]);        Dp();    }    return 0;}


原创粉丝点击