Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 1479 | Accepted: 788 |
&l t;p class="pst">Description
Input
Output
Sample Input
3 30 20
Sample Output
7
Hint
[as shown in this chart:
leader E
pack total used this
time leader speed dist minute
1 1 5 5 25
2 1 2 7 4
3 2* 4 11 16
4 2 2 13 4
5 3* 3 16 9
6 3 2 18 4
7 3 2 20 4
* = leader switch
Source
/* 看似复杂的 DP 问题其实是纸老虎,只要逻辑思路对了就好写了 要敢写 DP 公式啊,只要写出来了怎么实现就好商量,胆子要大啊 minT[i][j][k] 表示 i 只体力为 j 的奶牛走 k 所需的最小时间 则 minT[i][j][k] = min{minT[i][j][k], minT[i-1][j-e][k-e] + minT[1][j][e]} for 1 <= e <= k and j ,表示先以速度 e 走一分钟 minT[1][j][k] = min{minT[1][j][k], minT[1][j - e * e][k - e] + 1} for 1 <= e * e <= j and e <= k 剩下只有初始化的问题了 */ #include <iostream> #define minv(a, b) ((a) <= (b) ? (a) : (b)) #define MAX_N 22 #define MAX_E 102 #define MAX_D 102 #define MAX_VAL 99999999 using namespace std; int minT[MAX_N + 1][MAX_E + 1][MAX_D + 1]; int N, E, D; int main() { int c, i, j, k; scanf("%d%d%d", &N, &E, &D); minT[1][0][0] = 0; for(i = 1; i <= E; i++) minT[1][i][0] = 0; for(i = 1; i <= D; i++) minT[1][0][i] = MAX_VAL; for(i = 1; i <= E; i++) { for(j = 1; j <= D; j++) { minT[1][i][j] = MAX_VAL; for(k = 1; k * k <= i && k <= j; k++) minT[1][i][j] = minv(minT[1][i][j], minT[1][i - k * k][j - k] + 1); } } for(c = 2; c <= N; c++) { for(i = 1; i <= E; i++) { for(j = 1; j <= D; j++) { minT[c][i][j] = MAX_VAL; for(k = 1; k <= i && k <= j; k++) minT[c][i][j] = minv(minT[c][i][j], minT[c - 1][i - k][j - k] + minT[1][i][k]); } } } if(minT[N][E][D] >= MAX_VAL) printf("0/n"); else printf("%d/n", minT[N][E][D]); return 0; }