Skip to content

Commit c605489

Browse files
committed
DP
字符串编辑 数组区间 类型的dp问题 先找规律 然后列dp方程
1 parent c6b3743 commit c605489

File tree

5 files changed

+163
-0
lines changed

5 files changed

+163
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package DP.字符串编辑;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/9.
5+
*/
6+
public class 修改一个字符串为另一个字符串 {
7+
public int minDistance(String word1, String word2) {
8+
if (word1.equals("") && word2.equals(""))return 0;
9+
int m = word1.length();
10+
int n = word2.length();
11+
//把word1的前i个字符变成word2的前j个字符。
12+
int [][]dp = new int[m + 1][n + 1];
13+
for (int i = 1;i <= m;i ++) {
14+
dp[i][0] = i;
15+
}
16+
for (int j = 1;j <= n;j ++) {
17+
dp[0][j] = j;
18+
}
19+
dp[0][0] = 0;
20+
for (int i = 1;i <= m;i ++) {
21+
for (int j = 1;j <= n;j ++) {
22+
int c1 = dp[i][j - 1] + 1;
23+
int c2 = dp[i - 1][j] + 1;
24+
int c3 = dp[i - 1][j - 1] + 1;
25+
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
26+
c3 = dp[i - 1][j - 1];
27+
}
28+
int min = Math.min(Math.min(c1, c2), c3);
29+
dp[i][j] = min;
30+
}
31+
}
32+
return dp[m][n];
33+
}
34+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package DP.字符串编辑;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/9.
5+
*/
6+
public class 字符串编辑 {
7+
public static void main(String[] args) {
8+
String a = "eat";
9+
String b = "sea";
10+
System.out.println(minDistance(a, b));
11+
System.out.println(LCS(a, b));
12+
}
13+
public static int minDistance(String word1, String word2) {
14+
int len = LCS(word1, word2);
15+
return word1.length() + word2.length() - len - len;
16+
}
17+
public static int LCS(String a, String b) {
18+
if (a.equals("") || b.equals(""))return 0;
19+
//a的前i个字符与b的前j个字符的公共子序列长度
20+
int [][]dp = new int[a.length() + 1][b.length() + 1];
21+
for (int i = 0;i < dp.length;i ++) {
22+
dp[i][0] = 0;
23+
}
24+
for (int i = 0;i < dp[0].length;i ++) {
25+
dp[0][i] = 0;
26+
}
27+
for (int i = 1;i <= a.length();i ++) {
28+
for (int j = 1;j <= b.length();j ++) {
29+
if (a.charAt(i - 1) == b.charAt(j - 1)) {
30+
dp[i][j] = dp[i - 1][j - 1] + 1;
31+
}else {
32+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
33+
}
34+
}
35+
}
36+
return dp[a.length()][b.length()];
37+
}
38+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package DP.数组区间;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/9.
5+
*/
6+
public class 子数组最大的和 {
7+
public static void main(String[] args) {
8+
int []a = {-2,1,-3,4,-1,2,1,-5,4};
9+
System.out.println(maxSubArray(a));
10+
}
11+
public static int maxSubArray(int[] nums) {
12+
int []dp = new int[nums.length + 1];
13+
dp[0] = 0;
14+
for (int i = 1;i <= nums.length;i ++) {
15+
dp[i] = Math.max(dp[i - 1] + nums[i - 1],nums[i - 1]);
16+
}
17+
int max = dp[1];
18+
for (int i = 1;i <= nums.length;i ++) {
19+
if (dp[i] > max)max = dp[i];
20+
}
21+
return max;
22+
}
23+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package DP.数组区间;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/9.
5+
*/
6+
public class 数组中等差递增子区间的个数 {
7+
//首先找规律。3个等差数字 dp[3] = 1 .dp[4] = 4个数和后面3个数=2.
8+
//dp[5] = 前五个数 2345 345 = 3.可得dp[i] = dp[i - 1] + 1;
9+
public static void main(String[] args) {
10+
11+
}
12+
public int numberOfArithmeticSlices(int[] A) {
13+
int []dp = new int[A.length];
14+
for (int i = 2;i < A.length;i ++) {
15+
if (A[i - 1] - A[i - 2] == A[i] - A[i - 1]) {
16+
//此处的初值为1,接下来的推导都是正确的。
17+
dp[i] = dp[i - 1] + 1;
18+
}
19+
}
20+
int res = 0;
21+
//算出总的方法数。妙啊
22+
for (int cnt : dp) {
23+
res += cnt;
24+
}
25+
return res;
26+
}
27+
28+
// dfs行不通
29+
// static int count = 0;
30+
// public int numberOfArithmeticSlices(int[] A) {
31+
// for (int i = 2;i < A.length;i ++) {
32+
// dfs(A, i,true, 0);
33+
// }
34+
// return count;
35+
// }
36+
// public void dfs(int []A, int cur, boolean flag, int diff) {
37+
// if (flag && cur <= A.length) {
38+
// count ++;
39+
// return;
40+
// }
41+
// if (A[cur + 1] - A[cur] == A[cur + 2] - A[cur + 1] ) {
42+
// flag = true;
43+
// diff = A[cur + 2] - A[cur + 1]
44+
// }
45+
// }
46+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package DP.数组区间;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/9.
5+
*/
6+
public class 数组区间和 {
7+
class NumArray {
8+
private int[] sums;
9+
10+
// 求区间 i ~ j 的和,可以转换为 sum[j] - sum[i-1],其中 sum[i] 为 0 ~ i 的和。
11+
public NumArray(int[] nums) {
12+
sums = new int[nums.length];
13+
for (int i = 0; i < nums.length; i++) {
14+
sums[i] = i == 0 ? nums[0] : sums[i - 1] + nums[i];
15+
}
16+
}
17+
18+
public int sumRange(int i, int j) {
19+
return i == 0 ? sums[j] : sums[j] - sums[i - 1];
20+
}
21+
}
22+
}

0 commit comments

Comments
 (0)