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\n",minn) ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(HDU)