动态规划---最长公共子序列
2016-04-08 21:05
225 查看
public class LCSLength { static int[][] c;//c[i][j]存储Xi和Yj的最长公共子序列长度 static int[][] b;//b[i][j]记录c[i][j]的值是由哪一个子问题 解得到的 static char x[];//将第一个字符串转换为字符数组存储在x数组中 static char y[];//将第二个字符串转换为数组 public static void lcsLength(String str1,String str2){ int i,j; //初始化边界 for(i=0;i<=str1.length();i++) c[i][0]=0; for(j=0;j<=str2.length();j++) c[0][j]=0; //填充数组 for(i=1;i<=str1.length();i++) for(j=1;j<=str2.length();j++){ if(x[i-1]==y[j-1]){//比较两个字符相等时 c[i][j]=c[i-1][j-1]+1;//左上角 b[i][j]=1; }else{ if(c[i-1][j]>=c[i][j-1]){ c[i][j]=c[i-1][j];//左边 b[i][j]=2; }else{ c[i][j]=c[i][j-1];//上边 b[i][j]=3; } } 4000 } } public static void LCS(int i,int j,char[] x,int[][] b){ if(i==0||j==0) return; if(b[i][j]==1){ LCS(i-1,j-1,x,b); System.out.print(x[i-1]); }else if(b[i][j]==2) LCS(i-1,j,x,b); else LCS(i,j-1,x,b); } public static void main(String[] args) { String str1="jnavogak"; String str2="bjaova"; c=new int[str1.length()+1][str2.length()+1]; b=new int[str1.length()+1][str2.length()+1]; x = str1.toCharArray(); y = str2.toCharArray(); lcsLength(str1,str2); //最长长度为数组c最后一个位置数字 System.out.println("最长公共子序列长度:"+ c[str1.length()][str2.length()]); //递归输出 LCS(str1.length(),str2.length(),x,b); } }
最长公共子序列长度:4 java
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离