还不错的一道题目,要注意看清题意。
注意:
1. 普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O). 所以加速情况不加能量
2. 能量集满后获得一个加速卡(同时能量清0). 加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次集满,那么能量清零但得不到加速卡。
看清题目的话, 这题状态转移推一下,不是很难。
#include#include<string.h> #include 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; }