今日開始稍微學習動態規劃,前來總結下每日戰績、
例如,給定三角形:自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。[[2
],[3
,4],
[6,5
,7],
[4,1
,8,3
]]
class
solution
}return f[0]
;}}
之前做過不同路徑i ,也是乙個動態規劃,這道題多了一些障礙物,但是依然是一道典型的動態規劃問題。乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。
輸入:[
[0,0,0],
[0,1,0],
[0,0,0]
]輸出:
2解釋: 3x3 網格的正中間有乙個障礙物。
從左上角到右下角一共有 2 條不同的路徑:
向右 -> 向右 -> 向下 -> 向下
向下 -> 向下 -> 向右 -> 向右
class
solution
}return f[n-1]
[m-1];
}}
給定乙個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1:
輸入: 2
輸出: [0,1,1]
常規思路 分別遍歷求每個數1的個數即可但是題目要求採用o(n)的時間,
那麼這麼想,如果求5中1的個數,5的二進位制表示是101
不看最後一位 前兩位中1的個數也就是2中1的個數
因此狀態轉移方程為 f[i
]=f[
i>
>1]
+(i&
1)
f[i]=f[i>>1]+(i\&1)
f[i]=f
[i>
>1]
+(i&
1)
class
solution
return f;
}}
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
思考:他讓求最少硬幣個數,那麼狀態轉移就是一直+1,最後判斷最後的乙個狀態是否滿足要求。狀態轉移方程 f[n
]=mi
n(f[
n],f
[n−j
]+1)
f[n]=min(f[n],f[n-j]+1)
f[n]=m
in(f
[n],
f[n−
j]+1
)另外,除了第乙個,其他都需要置乙個很大的值,比總金額大即可
class
solution
}
輸入: nums =[[9,9,4],
[6,6,8],
[2,1,1]
]輸出: 4
解釋: 最長遞增路徑為 [1, 2, 6, 9]。
這道題,其實主要考察的應該是深搜+記憶化搜尋。遍歷每個元素,然後從每個元素為中心深搜,之後將引數儲存起來,下次如果在緩衝區,直接拿來用。
**如下
class
solution
,dy=
;private
static
int[
] dp ;
public
intdfs
(int
matrix,
int x,
int y)
return dp[x]
[y];
}public
intlongestincreasingpath
(int
matrix)
}
動態規劃1(DP)總結
遞迴是最簡單也是最直接的思路,分解小問題,然後得到最終問題的答案。但是遞迴 簡單,但是比較耗時。所以我們思路可以用遞迴,但是出於 效能考慮,還是要提公升效率。這當然是後期的優化了。動態規劃,回溯都是比較常用也比較常見的演算法。這篇來講動態規劃。動態規劃的核心 問題的最優解可以由子問題的最優解得到,那...
動態規劃1
維基百科 動態規劃是一種在數學和 電腦科學 中使用的,用於求解包含 重疊子問題 的最優化 問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有 求解 最短路徑 問題,揹...
動態規劃 1
動態規劃是對最優化問題的一種新的演算法設計方法。由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的沒計法對不同的問題,有各具特色的表示方式。不存在一種萬能的動態規劃演算法。但是可以通過對若干有代表性的問題的動態規劃演算法進行討論,學會這一設計方法。多階段決策過程最優化問題 動態規劃的...