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;
}
上一篇:各种编译不通过xcode


下一篇:ubuntu 开机自动挂载nfs服务器上的home分区