LeetCode 787 K站中转内最便宜的航班[动态规划] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 787 K站中转内最便宜的航班[动态规划] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
K次,找最小值,这样的关键词让我想起了广度优先的方法,但是n的范围最大能到100,这样很可能会有时间复杂度爆炸的用例,所以还是决定使用动态规划,定义dp数组dp[dst][k],表示到达dst经过k次中转所花费的最少金额,当dp[from][k - 1]
不为INT_MAX时,即from可到达,那么就更新dp[to][k]
,状态转移方程为dp[flight[1]][i] = min(dp[flight[1]][i], dp[flight[0]][i - 1] + flight[2]);
最后返回dp[dst][k + 1],这里为什么是k + 1而不是k,因为前面的k次都是中转,k + 1次才是真正最多经过k次所花费的最少金额,代码如下:
class Solution {
public:
int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
// k站中转,所以最多是k + 1站
vector<vector<int>> dp(n, vector<int>(k + 2, INT_MAX));
// 初始化
for(int i = 0; i <= k + 1; i ++) {
dp[src][i] = 0;
}
for(int i = 1; i <= k + 1; i ++) {
for(auto& flight : flights) {
// 如果能够到达from
if(dp[flight[0]][i - 1] != INT_MAX) {
// 更新最短距离
dp[flight[1]][i] = min(dp[flight[1]][i], dp[flight[0]][i - 1] + flight[2]);
}
}
}
return dp[dst][k + 1] != INT_MAX ? dp[dst][k + 1] : -1;
}
};
以上是关于LeetCode 787 K站中转内最便宜的航班[动态规划] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 787 K站中转内最便宜的航班[动态规划] HERODING的LeetCode之路
LeetCode 789. 逃脱阻碍者(贪心) / 1646. 获取生成数组中的最大值 / 787. K 站中转内最便宜的航班(有限制的最短路,重新审视迪杰斯特拉,动态规划)
缺迪杰斯特拉和SPFA] 文巾解题 787. K 站中转内最便宜的航班