HDU 1494 跑跑卡丁车 0-1背包

还不错的一道题目,要注意看清题意。

注意:

1. 普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O).      所以加速情况不加能量

2. 能量集满后获得一个加速卡(同时能量清0). 加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次集满,那么能量清零但得不到加速卡。

看清题目的话, 这题状态转移推一下,不是很难。

View Code
#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;
}

 

 

你可能感兴趣的:(ACM_DP)