題意:
n頭奶牛跑步,一個領跑,另外的跟跑??偩嚯x是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 }