DP 最长公共子序列
2013-01-05 13:50
155 查看
动态规划基础问题
弄清楚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
[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);
}
}
}
弄清楚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
[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);
}
}
}
相关文章推荐
- hdu 1159 Common Subsequence(DP最长公共子序列)
- 【BZOJ2423】[HAOI2010]最长公共子序列 DP
- hdu1159 - Common Subsequence (dp 最长公共子序列问题)
- bzoj 2423: [HAOI2010]最长公共子序列【dp+计数】
- NYOJ 036 最长公共子序列(dp )
- BestCoder Round #47 ($)(hdu5280 - 5282)dp最长公共子序列变形
- poj 1458 Common Subsequence dp 最长公共子序列
- 【DP入门】最长公共子序列
- UVa 531 Compromise (DP 最长公共子序列)
- hdu1159(dp)最长公共子序列
- 算法(DP):最长公共子序列问题
- 最长公共子序列LCS(DP)
- UVA 10100- Longest Match(dp之最长公共子序列)
- poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
- DP 最长公共子序列并标记输出
- UVA-111 History Grading(dp+最长公共子序列)
- 最长公共子序列dp
- UVA 531 Compromise 最长公共子序列(DP)
- hdu 1159 Common Subsequence(DP最长公共子序列)
- NYOJ 36 最长公共子序列 dp