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之路

787. K 站中转内最便宜的航班(dp)

LeetCode 789. 逃脱阻碍者(贪心) / 1646. 获取生成数组中的最大值 / 787. K 站中转内最便宜的航班(有限制的最短路,重新审视迪杰斯特拉,动态规划)

缺迪杰斯特拉和SPFA] 文巾解题 787. K 站中转内最便宜的航班

[M最短路] lc787. K 站中转内最便宜的航班(Bellman-Ford算法模板+边数限制最短路+dp思想)

[M最短路] lc787. K 站中转内最便宜的航班(Bellman-Ford算法模板+边数限制最短路+dp思想)