Leetcode 983.最低票价

问题描述

解题报告

d p [ i ] dp[i] dp[i] 表示截止于 i i i 天的最低消费。
如果第 i i i 天没有旅行计划,则 d p [ i ] = d p [ i − 1 ] dp[i]=dp[i-1] dp[i]=dp[i1]
如果第 i i i 天有旅行计划,则判断1天前选择一张为期1天的通行证、7天前选择为期7天的通行证、30天前选择为期30天的通行证 哪一种更为合适。
如果days数组为[1,2,3,4,5,6,7] ,则:
d p [ 0 ] = 0 ; d p [ 1 ] = 2 ; d p [ 2 ] = 2 ; d p [ 3 ] = 4 ; d p [ 4 ] = 4 ; d p [ 5 ] = 6 ; d p [ 6 ] = 6 ; d p [ 7 ] = 7 ; dp[0]=0;\\ dp[1]=2;\\ dp[2]=2;\\ dp[3]=4;\\ dp[4]=4;\\ dp[5]=6;\\ dp[6]=6; \\ dp[7]=7; dp[0]=0;dp[1]=2;dp[2]=2;dp[3]=4;dp[4]=4;dp[5]=6;dp[6]=6;dp[7]=7;

实现代码

class Solution {
public:
    int mincostTickets(vector<int>& days, vector<int>& costs) {
        vector<int>dp(366,-1);
        int n=days.size();
        dp[0]=0;
         for(int i=0;i<n;i++){
             dp[days[i]]=0;
         }
        for(int i=1;i<=days[n-1];i++){
            if(dp[i]==-1)
                dp[i] = dp[i-1];
            else{
                int tmp = dp[i-1] + costs[0];
                tmp = min(tmp, (i>=7?dp[i-7]:0) + costs[1]);
                tmp = min(tmp, (i>=30?dp[i-30]:0) +costs[2]);
                dp[i] = tmp;
            }
        }
        return dp[days[n-1]];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值