您的位置:首页 > 其它

poj 1946 Cow Cycl…

2013-04-14 19:38 281 查看
这个题目关键是状态的设计
别的就很好想了
dp[i][j][k]表示过了i分钟,第j头牛领头,剩余k能量时能跑的最远距离
然后这个题目还是有些关键点的,就是领头的牛领头跑完之后就可以掉队(这样的策略保证能得到最优解)。
有了这一点才有上面的状态设计。

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int n,e,d;
int dp[101][21][101];
int ans;

int max(int a,int b)
{
if(a>b)
return(a);
return(b);
}

int main()
{
scanf("%d %d
%d",&n,&e,&d);

memset(dp,0,sizeof(dp));
ans=0;
for(int i=0;;i++)
{

for(int j=1;j<=n;j++)

for(int k=0;k<=e;k++)

{

int
sum=dp[i][j][k];

for(int
p=1;p*p<=k;p++)

{

dp[i+1][j][k-p*p]=max(dp[i+1][j][k-p*p],dp[i][j][k]+p);

if(dp[i+1][j][k-p*p]>=d)

ans=i+1;

}

if(j+1<=n)

for(int
p=1;p*p+sum<=e;p++)

{

dp[i+1][j+1][e-p*p-sum]=max(dp[i+1][j+1][e-p*p-sum],dp[i][j][k]+p);

if(dp[i+1][j+1][e-p*p-sum]>=d)

ans=i+1;

}

}

if(ans)

break;
}

// for(int
i=1;i<=ans;i++)
// for(int
j=1;j<=n;j++)
// for(int
k=1;k<=e;k++)
// printf("%d %d %d
%d\n",i,j,k,dp[i][j][k]);

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