DP 最长公共子序列
来源:互联网 发布:淘宝如何进入闲鱼 编辑:程序博客网 时间:2024/05/01 18:17
动态规划基础问题
弄清楚result[i][j]含义就比较好理解了:
表示Xi与Yj的最长公共子序列
design[][]和print()方法是构建结果用的,如果只需要一个结果,可以省略
public class DP最长公共子序列 {static char[] s = "xyzxxxxxyyyyyyzzzzzz".toCharArray();static char[] c = "xxxyyyzzzxxxyyyzzzxyz".toCharArray();public static void main(String[] args) {int n = s.length;int m = c.length;// 构建结果// result[i][j]代表含义:// Xi与Yj的最长公共子序列int[][] result = new int[n + 1][m + 1];// 构建过程int[][] design = new int[n + 1][m + 1];// 构建最优解for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (s[i - 1] == c[j - 1]) {// 表示Xi和Yj最长公共子序列是由Xi-1和Yj-1的最长公共子序列尾部加上xi所得的子序列result[i][j] = result[i - 1][j - 1] + 1;design[i][j] = 1;}// 从resilt[i-1][j]和result[i][j-1]中寻找较大的else if (result[i - 1][j] >= result[i][j - 1]) {// result[i-1][j]较大,相等的时候选谁都无所谓,都可以// 表示Xi和Yj最长公共子序列与Xi-1和Yj的最长公共子序列相同result[i][j] = result[i - 1][j];design[i][j] = 2;} else {// 表示Xi和Yj最长公共子序列与Xi和Yj-1的最长公共子序列相同result[i][j] = result[i][j - 1];design[i][j] = 3;}}}System.out.println(result[n][m]);print(design, n, m);}public static void print(int[][] design, int i, int j) {if (i == 0 || j == 0)return;if (design[i][j] == 1) {// 1表示Xi和Yj最长公共子序列是由Xi-1和Yj-1的最长公共子序列尾部加上xi所得的子序列print(design, i - 1, j - 1);// 为了正序输出System.out.print(s[i - 1] + " ");} else if (design[i][j] == 2) {// 2表示Xi和Yj最长公共子序列与Xi-1和Yj的最长公共子序列相同print(design, i - 1, j);} else {// 3表示Xi和Yj最长公共子序列与Xi和Yj-1的最长公共子序列相同print(design, i, j - 1);}}}
- 最长公共子序列--DP
- DP---最长公共子序列
- 最长公共子序列dp
- DP 最长公共子序列
- DP 最长公共子序列
- 最长公共子序列-DP
- 【DP】最长公共子序列。
- 最长公共子序列 DP
- DP--最长公共子序列
- dp最长公共子序列
- dp 最长公共子序列
- DP最长公共子序列
- 最长公共子序列-dp
- dp--最长公共子序列
- 最长公共子序列<DP>
- 最长公共子序列(DP)
- dp-最长公共子序列
- dp最长公共子序列
- 一些强大的命令
- IOS开发 Blocks详解
- 电脑蓝屏原因查找
- Java英文单词Java基础常见英语词汇
- fontWithName后的参数设置
- DP 最长公共子序列
- 理解Rails框架
- java读取文件
- Linux中硬链接和符号链接的区别
- setStyle方法性能分析测试
- SQL Server Parallel Data Warehouse (PDW) 介绍
- Windows 7,Windows Server 2008 MSDTC配置
- Linux 上实现双向进程间通信管道
- 实施非接触CPU卡项目的注意事项