Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dd60b07

Browse files
author
lkxyyjx
committed
依然更新dp相关问题
1 parent 40a8de4 commit dd60b07

File tree

8 files changed

+315
-28
lines changed

8 files changed

+315
-28
lines changed

.idea/leetCode.iml

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

.idea/workspace.xml

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

src/044/S044.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
public class S044 {
2+
public boolean isMatch(String s, String p) {
3+
if (p==null||p.isEmpty())return s==null||s.isEmpty();
4+
int i=0,j=0,istart=-1,jstart=-1,slen=s.length(),plen=p.length();
5+
//判断s的所有字符是否匹配
6+
while (i<slen){
7+
//三种匹配成功情况以及匹配失败返回false
8+
if (j<plen&&(s.charAt(i)==p.charAt(j)||p.charAt(j)=='?')){
9+
i++;
10+
j++;
11+
}else if (j<plen&&p.charAt(j)=='*'){
12+
istart=i;
13+
jstart=j++;
14+
}else if (istart>-1){
15+
i=++istart;
16+
j=jstart+1;
17+
}else {
18+
return false;
19+
}
20+
}
21+
//s中的字符都判断完毕,则认为s为空,此时需要p为空或者p中只剩下星号的时候,才能成功匹配。
22+
//如果p中剩余的都是*,则可以移除剩余的*
23+
while (j<plen&&p.charAt(j)=='*')j++;
24+
return j==plen;
25+
}
26+
27+
public static void main(String[] str) {
28+
S044 solution = new S044();
29+
String s = "adceb";
30+
String p = "*a*b";
31+
System.out.println(solution.isMatch(s, p));
32+
}
33+
}

src/045/S045.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* State define:dp[n]表示从当前位置到数组最后一个位置需要的最小跳跃数
3+
* State transfer equation:dp[i] = min(dp[i+1],dp[i+2]......,dp[i+numsp[i]]) + 1
4+
* Base condition:dp[nums.length - 1] = 0
5+
*/
6+
public class S045 {
7+
8+
int dpMinJumps[];
9+
public int jump(int[] nums) {
10+
int n = nums.length;
11+
if (n < 2)return 0;
12+
dpMinJumps = new int[n];
13+
int step;
14+
int res;
15+
for (int i = n - 2; i >= 0; i --) {
16+
step = nums[i];
17+
res = dpMinJumps[i + 1];
18+
for (int j = 1; j <= step && i + j < n; j ++) {
19+
res = Math.min(res, dpMinJumps[i+j]);
20+
}
21+
dpMinJumps[i] = res + 1;
22+
}
23+
return dpMinJumps[0];
24+
}
25+
26+
public static void main(String[] str) {
27+
S045 solution = new S045();
28+
int[] nums = new int[] {2,3,1,1,4};
29+
boolean debug = true;
30+
System.out.println(solution.jump(nums));
31+
if (debug) {
32+
for(int i = 0; i < nums.length; i ++) {
33+
System.out.println(solution.dpMinJumps[i]);
34+
}
35+
}
36+
}
37+
}

src/070/S070.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* 比较简单,就不多写了dp[n]=dp[n-1] + dp[n-2]
3+
*/
4+
public class S070 {
5+
6+
int[] dpWays;
7+
public int climbStairs(int n) {
8+
switch (n) {
9+
case 0:
10+
return 0;
11+
case 1:
12+
return 1;
13+
case 2:
14+
return 2;
15+
default:
16+
dpWays = new int[n + 1];
17+
dpWays[0] = 1;
18+
dpWays[1] = 2;
19+
for (int i = 2; i < n; i++) {
20+
/* 卧槽突然发现居然是就是fibo数列 QAQ其实直接用公式算就行了*/
21+
dpWays[i] = dpWays[i-1] + dpWays[i-2];
22+
}
23+
return dpWays[n - 1];
24+
}
25+
}
26+
27+
public static void main(String[] str) {
28+
S070 solution = new S070();
29+
int n = 10;
30+
boolean debug = true;
31+
System.out.println(solution.climbStairs(n));
32+
if (debug) {
33+
for (int i = 0; i < n; i++) {
34+
System.out.println(solution.dpWays[i]);
35+
}
36+
}
37+
}
38+
}

src/072/S072.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
*
3+
*/
4+
public class S072 {
5+
6+
int[][] dpMinEditDistance;
7+
8+
public int minDistance(String word1, String word2) {
9+
int m,n;
10+
m = word1.length();
11+
n = word2.length();
12+
dpMinEditDistance = new int[m+1][n+1];
13+
for (int i=0; i<m+1; i++) {
14+
for (int j=0; j<n+1; j++) {
15+
if (i == 0 && j == 0) {
16+
dpMinEditDistance[i][j] = 0;
17+
} else if (i == 0 || j == 0) {
18+
dpMinEditDistance[i][j] = i == 0? j : i;
19+
} else {
20+
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
21+
dpMinEditDistance[i][j] = dpMinEditDistance[i - 1][j - 1];
22+
} else {
23+
dpMinEditDistance[i][j] = Math.min(Math.min(dpMinEditDistance[i-1][j], dpMinEditDistance[i][j-1]), dpMinEditDistance[i-1][j-1]) + 1;
24+
}
25+
}
26+
}
27+
}
28+
return dpMinEditDistance[m][n];
29+
}
30+
31+
public static void main(String[] str) {
32+
S072 solution = new S072();
33+
boolean debug = true;
34+
String word1 = "horse";
35+
String word2 = "ros";
36+
System.out.println(solution.minDistance(word1, word2));
37+
if (debug) {
38+
int m = word1.length();
39+
int n = word2.length();
40+
for (int i = 0;i < m;i++) {
41+
for (int j = 0; j < n; j++) {
42+
System.out.println("dpMinHP[" + i + "][" + j + "] = " + solution.dpMinEditDistance[i][j]);
43+
}
44+
}
45+
}
46+
}
47+
}

src/174/S174.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* State define:dp[i][j]为从当前格子走到目的所需的最少血量
3+
* State transfer equation:dp[i][j] = Math.max(1, Math.min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j])
4+
* Base condition:dp[m-1][n-1]=dungeon[m-1][n-1]>0?1:1-dungeon[m-1][n-1]
5+
*/
6+
public class S174 {
7+
8+
int[][] dpMinHP;
9+
10+
public int calculateMinimumHP(int[][] dungeon) {
11+
12+
int m = dungeon.length;
13+
int n = dungeon[0].length;
14+
15+
dpMinHP = new int[m][n];
16+
dpMinHP[m-1][n-1] = Math.max(1, 1 - dungeon[m-1][n-1]);
17+
for(int i = m - 2; i >= 0; i--){
18+
dpMinHP[i][n-1] = Math.max(1, dpMinHP[i+1][n-1] - dungeon[i][n-1]);
19+
}
20+
for(int i = n - 2; i >= 0; i--){
21+
dpMinHP[m-1][i] = Math.max(1, dpMinHP[m-1][i+1] - dungeon[m-1][i]);
22+
}
23+
24+
for(int i = m - 2; i >= 0; i--){
25+
for(int j = n - 2; j >= 0; j--){
26+
int dpmin = Math.min(dpMinHP[i+1][j], dpMinHP[i][j+1]);
27+
dpMinHP[i][j] = Math.max(1, dpmin - dungeon[i][j]);
28+
}
29+
}
30+
return dpMinHP[0][0];
31+
}
32+
33+
public static void main(String[] str) {
34+
S174 solution = new S174();
35+
boolean debug = true;
36+
int[][] dungeon = new int[][] {{1,-3,3},
37+
{0,-2,0},
38+
{-3,-3,-3}};
39+
int res = solution.calculateMinimumHP(dungeon);
40+
System.out.println(res);
41+
if (debug) {
42+
int m = dungeon.length;
43+
int n = dungeon[0].length;
44+
for (int i = 0;i < m;i++) {
45+
for (int j = 0; j < n; j++) {
46+
System.out.println("dpMinHP[" + i + "][" + j + "] = " + solution.dpMinHP[i][j]);
47+
}
48+
}
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)