PKU POJ 1946 Cow Cycling DP

题目让一队牛(n只)骑车,只要有一个过终点(跑d圈),就算完成任务。每只牛刚开始的能量为e,当队伍速度为x圈/分钟时,领头的消耗为x^2能量/分钟,后面的消耗为x。求最快完成时间。

dp[i][j][k]代表还剩i只牛没领跑,已经跑了j圈,领头的牛还有k能量的情况下最短用时。

#include <iostream>
using namespace std;
int dp[25][105][105];
int mmin(int a,int b)
{
    if (a==0)
        return b;
    else
        return a<b?a:b;
}
int main()
{
    int n,e,d,i,j,k,x;
    while (scanf("%d%d%d",&n,&e,&d)!=EOF)
    {
        for(i=0;i<=n;++i)
            for(j=0;j<=d;++j)
                for(k=0;k<=e;++k)
                    dp[i][j][k]=0;
        if(e<d)
            printf("0\n");
        else
        {
            dp[n-1][0][e]=1;
            for (i=n-1;i>=0;--i)
                for (j=0;j<d;++j)
                    for (k=e;k>=0;--k)
                        if (dp[i][j][k]>0)
                        {
                            for (x=1;x*x<=k&&j+x<=d;++x)
                                dp[i][j+x][k-x*x]=mmin(dp[i][j+x][k-x*x],dp[i][j][k]+1);
                            if(i>0)
                                for (x=1;x*x<=e-j&&j+x<=d;++x)
                                    dp[i-1][j+x][e-j-x*x]=mmin(dp[i-1][j+x][e-j-x*x],dp[i][j][k]+1);
                        }
            int res=0x7fffffff;
            for (i=n;i>=0;--i)
                for (k=e;k>=0;--k)
                    if(dp[i][d][k]&&dp[i][d][k]<res)
                        res=dp[i][d][k];
            printf("%d\n",res-1);
        }
    }
    return 0;
}

 

posted on 2013-03-09 16:10  Deller  阅读(164)  评论(0)    收藏  举报

导航