pku 1946 Cow Cycling 非常好的DP

pku 1946 Cow Cycling 非常好的DP

题意:
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  }

你可能感兴趣的:(pku 1946 Cow Cycling 非常好的DP)