算法學習 —— 動態規劃練習(二)
阿新 • • 發佈:2019-05-13
ESS 初始化 並且 輸出 lib program 可能 type 參考
一、不同路徑(LeetCode-62)
1.1 題目介紹
62. 不同路徑
1.2 解題思路
計數型動態規劃
最後一步
最右下角的坐標假設為(m,n),則假設走到(m,n)所有可能的路徑為f[m][n]
子問題
走到(m,n)的前一步有兩種可能一種是(m-1,n),一種是(m,n-1)
狀態轉移方程
f[m][n] = f[m-1][n] + f[m][n-1]
初始化和邊界
因為根據題意,只能向右走,或向下走。從(0,0)到位於(0,n)或(m,0)這點位置,都只有一種走法。
i = 0 或 j = 0 ,則f[i][j] = 0
1.3 解題代碼
class Solution { public int uniquePaths(int m, int n) { int[][] f = new int[m][n]; //最後一步 //f[m-1][n-1] = f[m-1][n-2] + f[m-2][n-1] //初始條件 //f[0][j] = 1 f[i][0] = 1 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]; } }
二、跳躍遊戲(LeetCode-55)
2.1 題目介紹
55. 跳躍遊戲
給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後一個位置。
示例 1:
輸入: [2,3,1,1,4]
輸出: true
解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後一個位置。
示例 2:
輸入: [3,2,1,0,4]
輸出: false
解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位置。
2.2 解題思路
存在型動態規劃
最後一步
確定狀態,最後一步,是f[n]能否走到n的位置
子問題
能否走到f[n],在n之前,如果有i+a[i] >= n 的話,並且f[i]可以到達,則f[n]也可以到達
狀態轉移方程
f[x] = f[i] & (i + a[i] >=x)
0 < i < x
初始化
f[0] = 0
2.3 解題代碼
class Solution { public boolean canJump(int[] nums) { int n = nums.length; boolean[] f = new boolean[n]; int i,j; f[0] = true; for(i=1;i<n;i++){ f[i] = false; for(j=0;j<i;j++){ if(f[j] && j+nums[j] >= i){ f[i] = true; break; } } } return f[n-1]; } }
參考視頻
動態規劃入門 Introduction to Dynamic Programming
算法學習 —— 動態規劃練習(二)