hdu 1494 跑跑卡丁车

题意:中文题、、、

思路:技能槽的状态一共有15种状态0% 20% 40% 60% 80% 100% 120%.....

dp[i][j] 代表通过第i条路的技能槽状态是j , 所以要考虑好哪些状态可以到达dp[i][j]是最优的就行了

dp[i][j] = min(dp[i-1][j-1] + a[i]  , dp[i-1][j+5] + b[i]) . 然后就是处理细节 

1.N圈处理 只要a[i%L] 就行 

2.状态j == 10 时 的 上一步状态也可能是 状态14 

#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 1000000
using namespace std;
int Min(int a , int b) {
    return a < b ? a : b;    
}
int main() {
    int dp[10010][16];
    int a[110] , b[110] , L , N , i , j;
    while(~scanf("%d%d",&L,&N)) {
        for(i = 0; i < L ; i ++) scanf("%d",&a[i]);
        for(i = 0; i < L ; i ++) scanf("%d",&b[i]);
        for(i = 0; i < L*N ; i ++)
            for(j = 0; j < 15 ; j ++)
            dp[i][j] = inf;
            dp[0][1] = a[0];
            for(i = 1 ; i < L*N ; i ++) {
                for(j = 0 ; j <= 14 ; j ++) {
                    if(j >= 10) dp[i][j] = Min(dp[i][j] , dp[i-1][j-1]+a[i%L]);
                    if(j < 10) {
                         if(j!=0)
                         dp[i][j] = Min(dp[i-1][j-1]+a[i%L] , dp[i-1][j+5]+b[i%L]);
                         else
                         dp[i][j] = Min(dp[i][j] , dp[i-1][j+5] + b[i%L]);
                    }
                    if(j == 10) dp[i][j] = Min(dp[i-1][j-1]+a[i%L] , dp[i-1][14]+a[i%L]);
                    //printf("%d\n",dp[i][j]);
                }
                //printf("**************\n");
            }
            int maxx = inf;
            for(j = 0 ; j < 15 ; j ++) {
                if(dp[L*N-1][j] < maxx) 
                maxx = dp[L*N-1][j];    
            }
            printf("%d\n",maxx);
    }  
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值