poj 1946 Cow Cycl…

来源:互联网 发布:aes256算法 java实现 编辑:程序博客网 时间:2024/05/18 01:53
这个题目关键是状态的设计
别的就很好想了
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++)
       {
           intsum=dp[i][j][k];
           for(intp=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(intp=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(inti=1;i<=ans;i++)
//    for(intj=1;j<=n;j++)
//    for(intk=1;k<=e;k++)
//    printf("%d %d %d%d\n",i,j,k,dp[i][j][k]);


   printf("%d\n",ans);
    return 0;
}