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; }
浙公网安备 33010602011771号