您好,欢迎来到星星旅游。
搜索
您的当前位置:首页2018.10.23 hdu4745Two Rabbits(区间dp)

2018.10.23 hdu4745Two Rabbits(区间dp)

来源:星星旅游


区间dp经典题目。


首先断环为链。
然后题目相当于就是在找最大的回文子序列。
注意两个位置重合的时候相当于范围是n,不重合时范围是n-1.
代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2005;
int n,a[N],f[N][N];
inline int dfs(int l,int r){
    if(l>r)return 0;
    if(f[l][r])return f[l][r];
    if(l==r)return f[l][r]=1;
    f[l][r]=max(dfs(l,r-1),dfs(l+1,r));
    if(a[l]==a[r])f[l][r]=max(f[l][r],dfs(l+1,r-1)+2);
    return f[l][r];
}
int main(){
	while(scanf("%d",&n)){
		if(!n)break;
		for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[n+i]=a[i];
        memset(f,0,sizeof(f));
        int ans=0;
        for(int i=1;i<=n;i++)ans=max(ans,dfs(i,i+n-1)),ans=max(ans,dfs(i,i+n-2)+1);
        printf("%d\n",ans);
    }
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务