最长公共子序列
来源:互联网 发布:灰鸽子软件下载 编辑:程序博客网 时间:2024/06/06 20:38
一个给定序列的子序列是在该序列中删去若干元素后得到的序列
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列
最长公共子序列
X = (A, B, C, B, D, A, B) Y = (B, D, C, A, B, A)
(B, C, B, A) (B, D, A, B)
完全代码
package org.fan.learn.dp;/** * Created by fan on 2016/9/14. */public class MaxPublicSubsequence { public static int[][] result; public static final char[] A = {'C','A','B','D','B','C','A','B'}; public static final char[] B = {'C','B','D','C','A','B','C','B','E'}; public static int searchDigui(int idxA, int idxB) { if (idxA < 0 || idxB < 0) { return 0; } int a = 0, b = 0, c = 0; if (A[idxA] == B[idxB]) { a = searchDigui(idxA-1, idxB-1) + 1; } b = searchDigui(idxA-1, idxB); c = searchDigui(idxA, idxB - 1); return Math.max(Math.max(a,b),c); } //记忆化搜索 public static int searchDiguiYouhua(int idxA, int idxB) { if (idxA < 0 || idxB < 0) { return 0; } if (result[idxA][idxB] >= 0) { return result[idxA][idxB]; } int a = 0, b = 0, c = 0; if (A[idxA] == B[idxB]) { a = searchDiguiYouhua(idxA - 1, idxB - 1) + 1; } b = searchDiguiYouhua(idxA-1, idxB); c = searchDiguiYouhua(idxA, idxB - 1); result[idxA][idxB] = Math.max(Math.max(a, b), c); return result[idxA][idxB]; } public static int searchDitui(int idxA, int idxB) { int a = 0, b = 0, c = 0; //初始化值 for (int j = 0; j < B.length; j++) { if (A[0] == B[j]) { result[0][j] = 1; } } for (int i = 1; i < A.length; i++) { if (A[i] == B[0]) { result[i][0] = 1; } for (int j = 1; j < B.length; j++) { if (A[i] == B[j]) { a = result[i-1][j-1] + 1; } b = result[i-1][j]; c = result[i][j-1]; result[i][j] = Math.max(Math.max(a, b), c); } } return result[idxA][idxB]; } public static void main(String[] args) { result = new int[A.length][B.length]; for (int i = 0; i < A.length; i++) { for (int j = 0; j < B.length; j++) { result[i][j] = -1; } } System.out.println(searchDigui(A.length - 1, B.length - 1)); System.out.println(searchDiguiYouhua(A.length-1, B.length-1)); for (int i = 0; i < A.length; i++) { for (int j = 0; j < B.length; j++) { result[i][j] = -1; } } System.out.println(searchDitui(A.length-1, B.length-1)); }}
0 0
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- Python脚本中文乱码问题
- Mysql 时间 '0000-00-00'异常解决
- swarm工作原理
- springmvc resource使用和原理
- Android nice在进程与线程调度中的作用
- 最长公共子序列
- poj 3204 Ikki's Story I - Road Reconstruction(最大流,增广路)
- <hadoop学习历程>--笔记心得8-总结
- velocity把字符串当做模板
- oracle exp命令中的full参数
- matlab calibration toolbox -- matlab标定工具的使用方法--去畸变和双目校正
- [js] ES5
- gallery
- java内存泄漏