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);}}}


原创粉丝点击