前言
动规规划和贪心都是训练逻辑思维的好题目,因为其中涉及问题抽象能力,需要将大问题准确的划分为规模更小性质相同的之问题。最低票价有着和01背包的 以第i结尾的最值 特点,但无额外的其他限定,所以从二维递推变成一维递推。
一、最低票价
二、01背包–以第i结尾的最值
/*
target:给出了旅行的日期,给出了不同持续期的票价和持续时间,计算最低消费。
明显可子问题递推,类似于01背包,但没有总和限定,所以二维变一维。
状态定义:f[i]表示第i天结束的最低消费。
*/
public int mincostTickets(int[] days, int[] costs) {
int n = days[days.length - 1];
int[] f = new int[n + 1]; // f[i]表示第i天结束的最低消费。
int idx = 0;
for (int i = days[0]; i <= n;++i ) {
if(i == days[idx]) {
int cost0 = i >= 1 ? f[i - 1] + costs[0] : costs[0];
int cost1 = i >= 7 ? f[i - 7] + costs[1] : costs[1];
int cost2 = i >= 30 ? f[i - 30] + costs[2] : costs[2];
f[i] = Math.min(cost0, Math.min(cost1, cost2));
++idx;
continue;
}
f[i] = f[i - 1];
}
return f[n];
}
总结
1)动规规划和贪心都是训练逻辑思维的好题目,因为其中涉及问题抽象能力,需要将大问题准确的划分为规模更小性质相同的之问题。
2)01背包第一种类型,因为有其他限定,需要二维递推;今天见识第2种,无额外限定,只需一维递推,但面向时间,划分子问题递推时较于隐式。
参考文献
[1] LeetCode 最低票价