题意:
n头奶牛跑步,一个领跑,另外的跟跑。总距离是k,如果某一单位时间速度为v,则领队奶牛消耗v^2能量,其他奶牛消耗v能量。每头奶牛初始的能量相同。问奶牛们到达终点的最短时间。
解法:
其他不说了,重要的是第i个牛在哪几个时刻领队并不重要,重要的是领了多少个时间单位的队,下面状态就不难划分了吧?
代码:
1 # include <stdio.h>
2 # include <string.h>
3 # include <stdlib.h>
4 int dp[21][101][101],n,e,d;
5 int solve(int used,int e1,int e2)
6 {
7 if(e1<0||e2<0) return -1;
8 else if(used>=n) return -1;
9 else if(e-e2>=d)
10 return 0;
11 else if(dp[used][e1][e2]!=-1) return dp[used][e1][e2]==-2?-1:dp[used][e1][e2];
12 else
13 {
14 int i;
15 dp[used][e1][e2]=-2;
16 for(i=1;e1-i*i>=0;i++)
17 if(solve(used,e1-i*i,e2-i)!=-1&&(dp[used][e1][e2]==-2||solve(used,e1-i*i,e2-i)+1<dp[used][e1][e2]))
18 dp[used][e1][e2]=solve(used,e1-i*i,e2-i)+1;
19 for(i=1;e2-i*i>=0;i++)
20 if(solve(used+1,e2-i*i,e2-i)!=-1&&(dp[used][e1][e2]==-2||solve(used+1,e2-i*i,e2-i)+1<dp[used][e1][e2]))
21 dp[used][e1][e2]=solve(used+1,e2-i*i,e2-i)+1;
22
23 return dp[used][e1][e2]==-2?-1:dp[used][e1][e2];
24 }
25 }
26 int main()
27 {
28 scanf("%d%d%d",&n,&e,&d);
29 memset(dp,-1,sizeof(dp));
30 printf("%d\n",solve(0,e,e)==-1?0:solve(0,e,e));
31 //system("pause");
32 return 0;
33
34 }