1 Star 0 Fork 0

luobg01/PFJ_coding

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
code037_mincostTickets.h 3.27 KB
一键复制 编辑 原始数据 按行查看 历史
luobg01 提交于 2023-12-27 08:33 . 补充题目编号
//
// Created by 罗炳国 on 2023/12/26.
//
#ifndef PFJ_CODE037_MINCOSTTICKETS_H
#define PFJ_CODE037_MINCOSTTICKETS_H
#include "commonHeader.h"
/**
* 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。
* 火车票有 三种不同的销售方式 :
* 一张 为期一天 的通行证售价为 costs[0] 美元;
* 一张 为期七天 的通行证售价为 costs[1] 美元;
* 一张 为期三十天 的通行证售价为 costs[2] 美元。
* 通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张 为期 7 天 的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。
* 返回 你想要完成在给定的列表 days 中列出的每一天的旅行所需要的最低消费 。
* 983.https://leetcode.cn/problems/minimum-cost-for-tickets/
* */
class code037_mincostTickets {
public:
int mincostTickets1(vector<int>& days, vector<int>& costs) {
return process(days, costs, 0);
}
/* 从index位置开始,到最后完成所有旅行一共需要的最低花费 */
int process(vector<int>& days, vector<int>& costs, int index) {
int N = days.size();
int ans = INT32_MAX;
if (index == N)
return 0;
for (int i = 0; i < 3; i++) {
int off = index + 1;
while (off < N && days[off] < days[index] + dur[i])
off++;
int tmp = costs[i];
tmp += process(days, costs, off);
ans = min(ans, tmp);
}
return ans;
}
int process(vector<int>& days, vector<int>& costs, int index, vector<int> &dp) {
int N = days.size();
int ans = INT32_MAX;
if (index == N)
return 0;
if (dp[index] != 0)
return dp[index];
for (int i = 0; i < 3; i++) {
int off = index + 1;
while (off < N && days[off] < days[index] + dur[i])
off++;
int tmp = costs[i];
tmp += process(days, costs, off, dp);
ans = min(ans, tmp);
}
dp[index] = ans;
return ans;
}
int mincostTickets2(vector<int>& days, vector<int>& costs) {
int N = days.size();
vector<int> dp (N + 1, 0);
return process(days, costs, 0, dp);
}
int mincostTickets3(vector<int>& days, vector<int>& costs) {
int N = days.size();
vector<int> dp(N + 1, 0);
for (int i = N - 1; i >= 0; i--) {
int off = i + 1;
dp[i] = INT32_MAX;
for (int j = 0; j < 3; j++) {
while (off < N && days[off] < days[i] + dur[j])
off++;
int tmp = costs[j];
tmp += dp[off];
dp[i] = min(dp[i], tmp);
}
}
return dp[0];
}
void test() {
vector<int> days {1,2,3,4,5,6,7,8,9,10,30,31};
vector<int> costs{2, 7, 15};
int ans = mincostTickets3(days, costs);
std::cout << "ans:" << ans << endl;
}
private:
vector<int> dur {1, 7, 30};
};
#endif//PFJ_CODE037_MINCOSTTICKETS_H
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/luobg01/pfj_coding.git
git@gitee.com:luobg01/pfj_coding.git
luobg01
pfj_coding
PFJ_coding
master

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385