LeetCode 656. 金币路径(DP)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 656. 金币路径(DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
1. 題目
給定一個數組 A(下標從 1 開始)包含 N 個整數:A1,A2,……,AN 和一個整數 B。
你可以從數組 A 中的任何一個位置(下標為 i)跳到下標 i+1,i+2,……,i+B 的任意一個可以跳到的位置上。
如果你在下標為 i 的位置上,你需要支付 Ai 個金幣。
如果 Ai 是 -1,意味著下標為 i 的位置是不可以跳到的。
現在,你希望花費最少的金幣從數組 A 的 1 位置跳到 N 位置,你需要輸出花費最少的路徑,依次輸出所有經過的下標(從 1 到 N)。
如果有多種花費最少的方案,輸出字典順序最小的路徑。
如果無法到達 N 位置,請返回一個空數組。
樣例 1 : 輸入: [1,2,4,-1,2], 2 輸出: [1,3,5]樣例 2 : 輸入: [1,2,4,-1,2], 1 輸出: []注釋 : 路徑 Pa1,Pa2,……,Pan 是字典序小于 Pb1,Pb2,……,Pbm 的,當且僅當第一個 Pai 和 Pbi 不同的 i 滿足 Pai < Pbi,如果不存在這樣的 i 那么滿足 n < m。 A1 >= 0。 A2, ..., AN (如果存在) 的范圍是 [-1, 100]。 A 數組的長度范圍 [1, 1000]. B 的范圍 [1, 100].來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/coin-path
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
class Solution { public:vector<int> cheapestJump(vector<int>& A, int B) {int n = A.size(), i, len, cost, idx = n-1;vector<int> dp(n, INT_MAX);vector<vector<int>> path(n);dp[0] = A[0];path[0] = {1};for(i = 0; i < n-1; i++) {if(dp[i] == INT_MAX)//狀態不存在continue;for(len = 1; len <= B; len++){if(i+len < n && A[i+len] != -1)//可以到達{if(dp[i+len] > dp[i]+A[i+len]){ //取最小的花費的路徑dp[i+len] = dp[i]+A[i+len];path[i+len] = path[i];path[i+len].push_back(i+len+1);}else if(dp[i+len] == dp[i]+A[i+len]){ //花費相同auto temp = path[i];temp.push_back(i+len+1);if(temp < path[i+len])//取字典序小的路徑path[i+len] = temp;}}}}return path[n-1];} };52 ms 22 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 656. 金币路径(DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天池 在线编程 最大得分(DP)
- 下一篇: LeetCode MySQL 180.