动态规划(Dynamic Programming)例题步骤详解
生活随笔
收集整理的這篇文章主要介紹了
动态规划(Dynamic Programming)例题步骤详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 動態規劃(Dynamic Programming)淺學 - 學習筆記
- 題目特點:
- 1、選擇硬幣組合問題:(Coin Change)
- 動態規劃題四個核心步驟:
- 一、確定狀態
- 二、轉移方程
- 三、初始條件和邊界情況
- 四、計算順序
- 小結:
- 編程代碼:(Java)
- 2、多少種路徑問題(Unique Paths)
- 1、確定狀態
- 2、轉移方程
- 3、初始條件和邊界情況
- 4、計算順序
- 編程代碼:(Java)
- 3、Jump Game
- 1、確定狀態
- 2、轉移方程
- 3、初始條件和邊界情況
- 4、計算順序
- 編程代碼:(Java)
- 總結
動態規劃(Dynamic Programming)淺學 - 學習筆記
題目特點:
1、選擇硬幣組合問題:(Coin Change)
動態規劃題四個核心步驟:
一、確定狀態
其中,最后一步是指:(上面例子舉例說)
其中,子問題是指:(上面例子舉例說)
遞歸解法:
遞歸解法的問題:
重復計算,效率不高!
應當如何避免?
將計算結果保存下來(memories),并改變計算順序。
二、轉移方程
三、初始條件和邊界情況
四、計算順序
小結:
編程代碼:(Java)
public class Solution{//{2,5,7} 27public int coinChange(int A[],int M){int[] f = new int[M+1]; //0...Mint len = A.length;//初始化f[0] = 0;int i,j;for(i=1;i<=M;++i){f[1] = Integer.MAX_VALUE;//f[i] = min{f[i-A[0]]+1,...,f[i-A[len-1]]+1}for(j=0;j<len;++j){if(i>=A[j] && f[i-A[j]] != Integer.MAX_VALUE){ //判斷條件f[i] = Math.min(f[i-A[j]]+1,f[i]);}}}if(f[M] == Math.MAX_VALUE){f[M] = -1;}return f[M];} }2、多少種路徑問題(Unique Paths)
1、確定狀態
子問題:
2、轉移方程
3、初始條件和邊界情況
4、計算順序
編程代碼:(Java)
public class Solution{public int uniquePaths(int m,int n){int[][] f = new int[m][n];int i,j;for(i=0;i<m;++i){ //行 從上到下for(j=0;j<n;++j){ //列 從左到右if(i=0 && j=0){f[i][j] = 1;}else{f[i][j] = f[i-1][j]+f[i][j-1];}}}return f[m-1][n-1];} }3、Jump Game
1、確定狀態
子問題:
2、轉移方程
3、初始條件和邊界情況
4、計算順序
編程代碼:(Java)
public class Solution{public boolean canJump(int[] A){int n = A.length;boolean[] f = new boolean[n];//初始化f[0] = true;int i,j;for(j = 1;j < n;j++){f[j] = false;for(i=0;i<j;i++){if(f[i] && i+A[i] >= j){f[j] = true;break;}}}return f[n-1];} }此題若用貪心算法時間復雜度則為O(n):
貪心算法解題思路
這個問題可以通過遞歸很容易解決來處理,我們想要知道能否到達index,那么只需要知道index之前的元素是不是有nums[i]+i >= index for i in range(index)(也就是index之前是不是有位置可以到達index)。
public class Solution {public boolean canJump(int[] nums) {int reach = nums[0];for(int i = 1; i < nums.length && reach >= i; i++)if(i + nums[i] > reach) reach = i + nums[i]; //貪心策略return reach >= (nums.length-1) ? true : false;} }總結
此博文是在網上看了一個關于動態規劃的學習視頻所記錄,如有問題還請指出,感謝。
總結
以上是生活随笔為你收集整理的动态规划(Dynamic Programming)例题步骤详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shiro学习记录(详细)
- 下一篇: 关于使用jQuery时$(documen