您的位置:首页 > 其它

动态规划-最优解

2016-10-12 14:34 183 查看
动态规划:动态规划是一种思想。是由暴力递归简化而来的编程思想,在编程中变化很大。我的总结如下:

所谓求最优解就是先满足时间复杂度情况下,使用最小的空间
最小编辑代价(距离):
从str1变为str2,可以有三个操作,增加一个字符,删除一个字符,变换一个字符,求费用最小。
第一步:以dp[i][j]表示str1[0….i-1]到str2[0….j-1]最小代价。因为我们加入了““串做匹配。
第二步:计算dp[i][j]。当str1[i-1]==str2[i-1],dp[i][j]=dp[i-1][j-1],不等于的话有3种操作方法。替换,删除,增加。
替换:dp[i][j]=dp[i-1][j-1]+1;
删除:dp[i][j]=dp[i-1][j]+c
增加:dp[i][j]=dp[i][j-1]+a
代码如下:
public class Problem_09_EditCost {

public static int minCost1(String str1, String str2, int ic, int dc, int rc) {
if (str1 == null || str2 == null) {
return 0;
}
char[] chs1 = str1.toCharArray();
char[] chs2 = str2.toCharArray();
int row = chs1.length + 1;
int col = chs2.length + 1;
int[][] dp = new int[row][col];
for (int i = 1; i < row; i++) {
dp[i][0] = dc * i;
}
for (int j = 1; j < col; j++) {
dp[0][j] = ic * j;
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
if (chs1[i - 1] == chs2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = dp[i - 1][j - 1] + rc;
}
dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + ic);
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + dc);
}
}
return dp[row - 1][col - 1];
}

public static int minCost2(String str1, String str2, int ic, int dc, int rc) {
if (str1 == null || str2 == null) {
return 0;
}
char[] chs1 = str1.toCharArray();
char[] chs2 = str2.toCharArray();
char[] longs = chs1.length >= chs2.length ? chs1 : chs2;
char[] shorts = chs1.length < chs2.length ? chs1 : chs2;
if (chs1.length < chs2.length) { // str2较长就交换ic和dc的值
int tmp = ic;
ic = dc;
dc = tmp;
}
int[] dp = new int[shorts.length + 1];
for (int i = 1; i <= shorts.length; i++) {
dp[i] = ic * i;
}
for (int i = 1; i <= longs.length; i++) {
int pre = dp[0]; // pre表示左上角的值
dp[0] = dc * i;
for (int j = 1; j <= shorts.length; j++) {
int tmp = dp[j]; // dp[j]没更新前先保存下来
if (longs[i - 1] == shorts[j - 1]) {
dp[j] = pre;
} else {
dp[j] = pre + rc;
}
dp[j] = Math.min(dp[j], dp[j - 1] + ic);
dp[j] = Math.min(dp[j], tmp + dc);
pre = tmp; // pre变成dp[j]没更新前的值
}
}
return dp[shorts.length];
}

public static void main(String[] args) {
String str1 = "ab12cd3";
String str2 = "abcdf";
System.out.println(minCost1(str1, str2, 5, 3, 2));
System.out.println(minCost2(str1, str2, 5, 3, 2));

str1 = "abcdf";
str2 = "ab12cd3";
System.out.println(minCost1(str1, str2, 3, 2, 4));
System.out.println(minCost2(str1, str2, 3, 2, 4));

str1 = "";
str2 = "ab12cd3";
System.out.println(minCost1(str1, str2, 1, 7, 5));
System.out.println(minCost2(str1, str2, 1, 7, 5));

str1 = "abcdf";
str2 = "";
System.out.println(minCost1(str1, str2, 2, 9, 8));
System.out.println(minCost2(str1, str2, 2, 9, 8));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息