动态规划-最优解

来源:互联网 发布:sql server字段默认值 编辑:程序博客网 时间:2024/05/14 04:38

动态规划:动态规划是一种思想。是由暴力递归简化而来的编程思想,在编程中变化很大。我的总结如下:

所谓求最优解就是先满足时间复杂度情况下,使用最小的空间

最小编辑代价(距离):

从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));}}


0 0
原创粉丝点击