HDU 1494 跑跑卡丁车 0-1背包
2012-08-26 16:13
162 查看
还不错的一道题目,要注意看清题意。
注意:
1. 普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O). 所以加速情况不加能量
2. 能量集满后获得一个加速卡(同时能量清0). 加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次集满,那么能量清零但得不到加速卡。
看清题目的话, 这题状态转移推一下,不是很难。
View Code
注意:
1. 普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O). 所以加速情况不加能量
2. 能量集满后获得一个加速卡(同时能量清0). 加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次集满,那么能量清零但得不到加速卡。
看清题目的话, 这题状态转移推一下,不是很难。
View Code
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define inf 1<<29 int n, l; int dp[101][15]; int a[101], b[101]; int main() { int i, j, k; while( ~scanf("%d%d", &l, &n) ) { for(i = 1; i <= l; i++) scanf("%d", &a[i]); for(i = 1; i <= l; i++) scanf("%d", &b[i]); for(i = 1 ; i < 15; i++) dp[0][i] = inf; dp[0][0] = 0; for(k = 1; k <= n; k++) { for(i = 1; i <= l; i++) for(j = 0; j < 15; j++) { if(j == 0) dp[i][j] = dp[i-1][j+5] + b[i]; //0是加速后才能出现的状态 else if(j == 10) //考虑当有2张加速卡和80%的能量时, 加了能量,变为只有2张加速卡 dp[i][j] = min(dp[i-1][j-1], dp[i-1][14]) + a[i]; else if(j + 5 < 15) //选择是不是加速 dp[i][j] = min(dp[i-1][j-1] + a[i], dp[i-1][j+5] + b[i]); else //其它情况都无法加速,只能普通行驶 dp[i][j] = dp[i-1][j-1] + a[i]; } for(j = 0; j < 15; j++)//对每圈的状态进行滚动操作,大大节约了内存 dp[0][j] = dp[l][j]; } int ans = dp[l][0]; for(i = 1; i < 15; i++) ans = min(ans, dp[l][i]); printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU 1494 跑跑卡丁车 0-1背包
- HDU 1494 跑跑卡丁车 (分段DP)
- Hdu 1494 跑跑卡丁车
- hdu 1494 跑跑卡丁车(dp)
- hdu 1494 跑跑卡丁车
- hdu 1494 跑跑卡丁车
- hdu 1494 跑跑卡丁车
- HDU-1494-跑跑卡丁车
- hdu 1494 跑跑卡丁车(dp)
- HDU - 1494 跑跑卡丁车(BFS+DP)
- HDU-1494 跑跑卡丁车 DP
- HDU - 1494 - 跑跑卡丁车
- !HDU 1494 跑跑卡丁车-dp-
- HDU-1494-跑跑卡丁车
- hdu1494 跑跑卡丁车 (动态规划)
- HDU ~ 1494 ~ 跑跑卡丁车(DP)
- HDU 1494 跑跑卡丁车 dp
- hdu 1494 跑跑卡丁车 dp
- hdu 1494 跑跑卡丁车(动态规划)
- HDU 1494 跑跑卡丁车