Skip to content

Commit e88cce8

Browse files
committed
Week06
1 parent e9b3f5d commit e88cce8

6 files changed

Lines changed: 129 additions & 0 deletions

File tree

.idea/leetcode/editor.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/production/algorithm010/Week06/NOTE.md

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Week06/LC120_triangle.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package Week06;
2+
3+
import java.util.List;
4+
5+
public class LC120_triangle {
6+
public int minimumTotal(List<List<Integer>> triangle) {
7+
8+
int n = triangle.size();
9+
int m = triangle.get(n-1).size();
10+
11+
int[][] dp = new int[n+1][m+1];
12+
for (int i=n-1;i>=0;i--){
13+
//for (int j=0;j<triangle.get(i).size();j++){
14+
for (int j=triangle.get(i).size()-1;j>=0;j--){
15+
dp[i][j]=Math.min(dp[i+1][j],dp[i+1][j+1]) + triangle.get(i).get(j);
16+
}
17+
}
18+
return dp[0][0];
19+
}
20+
21+
/*
22+
* 可以用一维数组记录中间值;
23+
* 状态转移方程:f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j];
24+
* */
25+
public int minimumTotal_2(List<List<Integer>> triangle) {
26+
27+
int n = triangle.size();
28+
int m = triangle.get(n-1).size();
29+
30+
int[] dp = new int[m+1];
31+
for (int i=n-1;i>=0;i--){
32+
//for (int j=0;j<triangle.get(i).size();j++){
33+
for (int j=triangle.get(i).size()-1;j>=0;j--){
34+
dp[j]=Math.min(dp[j],dp[j+1]) + triangle.get(i).get(j);
35+
}
36+
}
37+
return dp[0];
38+
}
39+
}

Week06/LC62_unique_paths.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,20 @@ public int uniquePaths(int m, int n) {
2121
}
2222
return dp[n-1];
2323
}
24+
25+
26+
public int uniquePaths_2(int m, int n) {
27+
if (m <= 0 || n <= 0) {
28+
return 0;
29+
}
30+
int[][] dp = new int[m+1][n+1];
31+
32+
dp[0][1]=1; // or dp[1][0]=1;
33+
for (int i=1;i<=m;i++){
34+
for (int j=1;j<=n;j++){
35+
dp[i][j] = dp[i-1][j] + dp[i][j-1];
36+
}
37+
}
38+
return dp[m][n];
39+
}
2440
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package Week06;
2+
3+
public class LC70_climbing_stairs_ii {
4+
5+
//每次你可以爬 1 或 2 或 3 个台阶
6+
public int climbStairs(int n) {
7+
// Dynamic Programming
8+
if(n<=3) return n;
9+
10+
int[] dp = new int[n+1];
11+
dp[0]=0;
12+
dp[1]=1;
13+
dp[2]=2;
14+
dp[3]=4;
15+
16+
for(int i=4;i<=n;i++){
17+
dp[i] = dp[i-1]+dp[i-2]+dp[i-3];
18+
}
19+
return dp[n];
20+
}
21+
22+
//每次你可以爬 1 或 2 个台阶,相邻不能重。如 1,1,2 或 122
23+
public int climbStairs_3(int n) {
24+
// Dynamic Programming
25+
if(n<=3) return n;
26+
27+
int[] dp = new int[n+1];
28+
dp[0]=0;
29+
dp[1]=1;
30+
dp[2]=1;
31+
dp[3]=2;
32+
dp[4]=2;
33+
34+
for(int i=5;i<=n;i++){
35+
dp[i] = dp[i-1]-1+dp[i-2]-1;
36+
}
37+
return dp[n];
38+
}
39+
40+
}
41+
42+
class Test{
43+
public static void main(String[] args) {
44+
LC70_climbing_stairs_ii s =new LC70_climbing_stairs_ii();
45+
int res = s.climbStairs_3(7);
46+
47+
System.out.println("Result=" +res);
48+
}
49+
}

Week06/NOTE.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,14 @@
77
共性:找到重复子问题
88

99
差异性:最优子结构,中途可以淘汰次优解
10+
11+
动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存。
12+
第一步骤:定义数组元素的含义
13+
第二步骤:找出数组元素之间的关系式,最优子结构,把大的问题拆分成小的问题
14+
第三步骤:找出初始值
15+
优化: 保存的中间值是否可以覆盖,用一维数组保存中间值
16+
17+
DP: 解题公式:
18+
a.分治(子问题)
19+
b.状态数组定义
20+
c.DP方程

0 commit comments

Comments
 (0)