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;
}
1万+



被折叠的 条评论
为什么被折叠?



