动态规划6-LCS(最长公共子序列)
2014-07-16 16:54
176 查看
继续动态规划O(∩_∩)O~
暑假之前就写了的,只是去实习了,没来及贴上来。
关于动态规划的基础知识,参见算法与数据结构之前的文章,(其实我也要再看看,当时理解的自认为还比较深刻,现在又忘得差不多了)
LCS问题描述,就不说了,网上一大堆。如果看了我前面的文章,怎样来用动态规划解决,也应该很简单了。
不废话,动态规划的难点在于问题刻画和发现最优子结构,以及怎样逆向思维(居然还记得这么多,,,):
最长公共子序列的结构:
设X = { x1 , ... , xm },Y = { y1 , ... , yn }及它们的最长子序列Z = { z1 , ... , zk }
则
1、若 xm = yn , 则 zk = xm = yn,且Z[k-1] 是 X[m-1] 和 Y[n-1] 的最长公共子序列
2、若 xm != yn ,且 zk != xm , 则 Z 是 X[m-1] 和 Y 的最长公共子序列
3、若 xm != yn , 且 zk != yn , 则 Z 是 Y[n-1] 和 X 的最长公共子序列
子问题的递归结构:
当 i = 0 , j = 0 时 , c[i][j] = 0
当 i , j > 0 ; xi = yi 时 , c[i][j] = c[i-1][j-1] + 1
当 i , j > 0 ; xi != yi 时 , c[i][j] = max { c[i][j-1] , c[i-1][j] }
直接贴代码:
--------------------------------------------------------------------------------------------------------------------------------------------------
总结:复习动态规划
暑假之前就写了的,只是去实习了,没来及贴上来。
关于动态规划的基础知识,参见算法与数据结构之前的文章,(其实我也要再看看,当时理解的自认为还比较深刻,现在又忘得差不多了)
LCS问题描述,就不说了,网上一大堆。如果看了我前面的文章,怎样来用动态规划解决,也应该很简单了。
不废话,动态规划的难点在于问题刻画和发现最优子结构,以及怎样逆向思维(居然还记得这么多,,,):
最长公共子序列的结构:
设X = { x1 , ... , xm },Y = { y1 , ... , yn }及它们的最长子序列Z = { z1 , ... , zk }
则
1、若 xm = yn , 则 zk = xm = yn,且Z[k-1] 是 X[m-1] 和 Y[n-1] 的最长公共子序列
2、若 xm != yn ,且 zk != xm , 则 Z 是 X[m-1] 和 Y 的最长公共子序列
3、若 xm != yn , 且 zk != yn , 则 Z 是 Y[n-1] 和 X 的最长公共子序列
子问题的递归结构:
当 i = 0 , j = 0 时 , c[i][j] = 0
当 i , j > 0 ; xi = yi 时 , c[i][j] = c[i-1][j-1] + 1
当 i , j > 0 ; xi != yi 时 , c[i][j] = max { c[i][j-1] , c[i-1][j] }
直接贴代码:
package Section8; public class LCS { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub char[] A = {'a','b','c','b','d','a','b'}; char[] B = {'b','d','c','b','a'}; int lcs = LCS(A,B); System.out.println(lcs); } public static int LCS(char[] A,char[] B){ //接受2个字符数组,返回其最长公共子序列的长度 int m = A.length; int n = B.length; int[][] Result = new int[m] ; //要求Result[m-1][n-1] char[] cc = new char[min(m,n)]; int position = 0; //按行填 for(int i = 0;i <= m - 1;i++) { for(int j = 0;j <= n-1;j++) { //确定了一个(i , j),对此位置进行动态规划填数 /* if(A[i] == B[j]) Result[i][j] = Result[i-1][j-1] + 1; else Result[i][j] = max(Result[i-1][j],Result[i][j-1]); */ if(A[i] == B[j]) { if(i - 1 < 0 || j - 1 < 0) Result[i][j] = 0 + 1; else Result[i][j] = Result[i-1][j-1] + 1; } else { int C1 = 0,C2 = 0; if(i - 1 >= 0) C1 = Result[i-1][j]; if(j - 1 >= 0) C2 = Result[i][j-1]; Result[i][j] = max(C1,C2); } } } return Result[m-1][n-1]; } private static int max(int a,int b){ if(a >= b) return a; return b; } private static int min(int a,int b){ if(a >= b) return b; return a; } }
--------------------------------------------------------------------------------------------------------------------------------------------------
总结:复习动态规划
相关文章推荐
- 动态规划之最长公共子序列 (LCS )
- 动态规划7:最长公共子序列(LCS)
- 转【算法之动态规划(三)】动态规划算法之:最长公共子序列 & 最长公共子串(LCS)&字符串相似度算法
- 动态规划---LCS最长公共子序列
- 动态规划—最长公共子序列LCS
- 动态规划 LCS 求两个序列A,B中全部的最长公共子序列
- 最长公共子序列LCS(动态规划基础)
- 【经典问题】二维动态规划问题:求最长公共子序列LCS
- 动态规划5:LCS最长公共子序列问题
- 动态规划:最长公共子序列(LCS)
- 动态规划解最长公共子序列问题(LCS)C语言加注释
- 动态规划之最长公共子序列(LCS)问题
- 算法之动态规划(LCS最长公共子序列, edit distance,交叉子串)
- 动态规划之最长公共子序列(lcs)
- 【算法之动态规划(三)】动态规划算法之:最长公共子序列 & 最长公共子串(LCS),字符串相似度算法
- 动态规划实现最长公共子序列(LCS)算法
- 算法:动态规划——最长公共子序列(LCS)
- 动态规划_最长公共子序列(LCS)
- 动态规划之最长公共子序列问题(LCS)