您的位置:首页 > 其它

sdut1309 不老的传说问题(区间dp)

2016-02-25 15:16 393 查看

sdut1309

分析

类似于hdu4283,可以做完那道题再来试试,这道题的不同就是有刷的长度限制,那么在更新的时候要判断一下是不是符合长度,而且这道题刷的石头连成一个环,那么就整体往后复制,最后判断 ans=min(ans,dp[i][i+n-1]);即可。

题目

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1309

代码

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int n,c,k;
int dp[410][410];
int a[410];

int main()
{
while(scanf("%d %d %d",&n,&c,&k)!=EOF)
{
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
a[n+i]=a[i];
}

for(int i=1; i<=2*n; i++)
for(int j=i+1; j<=2*n; j++)
dp[i][j]=0x3f3f3f3f;

for(int i=1; i<=2*n; i++)
dp[i][i]=1;

for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=2*n;i++)
{
int j=i+len-1;
if(j-i+1<=k)
dp[i][j]=dp[i+1][j]+1;
int t=min(i+k-1,j);
for(int k=i+1;k<=t;k++)
if(a[i]==a[k])
dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
}
}

int ans=0x3f3f3f3f;
for(int i=1;i<=n;i++)
ans=min(ans,dp[i][i+n-1]);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: