題意:
n頭奶牛跑步,一個(gè)領(lǐng)跑,另外的跟跑??偩嚯x是k,如果某一單位時(shí)間速度為v,則領(lǐng)隊(duì)奶牛消耗v^2能量,其他奶牛消耗v能量。每頭奶牛初始的能量相同。問(wèn)奶牛們到達(dá)終點(diǎn)的最短時(shí)間。
解法:
其他不說(shuō)了,重要的是第i個(gè)牛在哪幾個(gè)時(shí)刻領(lǐng)隊(duì)并不重要,重要的是領(lǐng)了多少個(gè)時(shí)間單位的隊(duì),下面狀態(tà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 }