动态规划-最优解
来源:互联网 发布: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
- 动态规划-最优解
- 【动态规划】最优时间表
- 动态规划--最优编辑
- 动态规划-最优编辑
- 动态规划求解最大子段问题的最优解
- 算法——最优解之动态规划
- 动态规划算法-----找零钱问题(求最优解)
- 动态规划——求数字三角形最优解和最优路径
- 算法之动态规划最优二叉树
- 动态规划--最优二叉查找树
- 动态规划求解资源最优分配问题
- 动态规划之最优矩阵连乘
- 最优二叉查找树(动态规划)
- 动态规划之-最优二叉查找树
- 动态规划-最优二叉搜索树
- 动态规划--最优二叉搜索树
- 最优三角划分(动态规划) By ACReaper
- 动态规划---->最优二分检索树
- 使用Python
- UITextField 密码明文及密文切换问题
- Layout组件综合训练
- swift调用OC代码和第三方库
- ssm项目中动态Quartz定时任务的实现(定时任务存在表中,而不是在.xml中)
- 动态规划-最优解
- 弧线运动
- 重拾C语言之指针篇(三)
- Android笔记:ToolBar和SearchView使用
- 村花的swift学习笔记2
- 对WM_NCHITTEST消息的了解+代码实例进行演示
- Java虚拟机参数 -XX等相关参数应用
- Spring AOP 不同配置方式产生的冲突问题
- Go语言字符串反转