HDU 1494 跑跑卡丁车 (DP)

题目链接

题意 : 中文题不详述。

思路 : sum = L*N 段,每走过一段如果不用加速卡的话,能量会增20%,将20%看作1,也就是说每涨到15就要变为10,所以最多是14才不浪费。

dp[i][j]代表第 i 段路需要能量是 j 的最少时间。状态转移方程是

//不用能量卡的时候
dp[i][j+1] = min(dp[i-1][j]+a[(i-1)%L],dp[i][j+1]) ;
//用能量卡的时候,用完了之后能量卡减5
dp[i][j-5] = min(dp[i][j-5],dp[i-1][j]+b[(i-1)%L]) ;

//HDU 1494
#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std ;

int a[110],b[110] ;
int dp[11000][20] ;
const int INF = 999999999 ;

int main()
{
    int L ,N ;
    while(~scanf("%d %d",&L,&N))
    {
        for(int i = 0 ; i < L ; i ++)
            scanf("%d",&a[i]) ;
        for(int i = 0 ; i < L ; i++)
            scanf("%d",&b[i]) ;
        int sum = L*N ;
        for(int i = 0 ; i <= sum ; i++)
            for(int j = 0  ; j  <= 15 ; j++)
                dp[i][j] = INF ;
        dp[0][0] = 0 ;
        for(int i = 1 ; i <= sum ; i++)
        {
            for(int j = 14 ; j >= 0 ; j --)//不用能量卡的时候
                dp[i][j+1] = min(dp[i-1][j]+a[(i-1)%L],dp[i][j+1]) ;
            for(int j = 14 ; j >= 5 ; j--)//用能量卡的时候,用完了之后能量卡减5
                dp[i][j-5] = min(dp[i][j-5],dp[i-1][j]+b[(i-1)%L]) ;
            dp[i][10] = min(dp[i][10],dp[i][15] ) ;//每次满15之后都要变成10
        }
        int minn = INF ;
        for(int i = 0 ; i < 15 ; i++)
            minn = min(minn,dp[sum][i]) ;
        printf("%d
",minn) ;
    }
    return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3652826.html