983. 最低票价 C++

文章介绍了一个使用动态规划方法解决的编程问题,目标是在给定旅行天数和不同时间段通行证成本的情况下,找到最小花费的购票策略。通过逆向计算从最后一天开始,逐天考虑是否出门以及购买不同天数通行证的最低费用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Solution {
public:
    int mincostTickets(vector<int>& days, vector<int>& costs) {
        // 状态定义: f[i] 表示 i 天及之后 旅行所需的最小花费
        int f[366]{};
        
        // 标注哪些天 出门
        for (int v: days) f[v] = 1;
        
        // 由于状态转移是逆向的 所以倒序 初始状态为 第365天,如果出门了,因为是最后一天所以买一张最便宜的通行证就行了 否则f[365]就是0
        f[365] = f[365] == 1 ? min(costs[0], min(costs[1], costs[2])) : 0;
        
    
        for (int i = 364; i > -1; --i) {
            if (f[i] > 0) {
                int d1 = i+1 < 366 ? costs[0] + f[i+1] : costs[0];
                int d7 = i+7 < 366 ? costs[1] + f[i+7] : costs[1];
                int d30 = i+30 < 366 ? costs[2] + f[i+30] : costs[2];
                // 如果在第i天出门,那么f[i] 要更新,买一天的票的成本加上下一天的最少费用,买七天的票的成本加上之后第8天的最少费用,买30天的票的成本加上第30天之后的最少费用,他们三者取最小值
                f[i] = min(d1, min(d7,d30));
            } else {
                //如果不出门 就是下一天的最小费用
                f[i] = f[i+1];
            }
        }
        return f[0];
    }
};

类似题目:

2140. 解决智力问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值