LCS问题是常见的可利用动态规划算法进行解决的问题。这里利用备忘录算法对求解过的子问题进行备份存储,避免了相同子问题的重复求解。LCS问题子问题的递归关系式如下:
具体代码实现如下:
1: static int LCS_Memo(int[][] c,char[] X,char[] Y,int i,int j)
2: {
3: if( (i == 0) || (j == 0) )
4: c[i][j]=0;
5: else if(X[i-1] == Y[j-1])
6: c[i][j]=LCS_Memo(c,X,Y,i-1,j-1)+1;
7: else
8: {
9: int p=LCS_Memo(c,X,Y,i-1,j);
10: int q=LCS_Memo(c,X,Y,i,j-1);
11: if(p >= q)
12: c[i][j]=p;
13: else
14: c[i][j]=q;
15: }
16: return c[i][j];
17: }
18:
19: static int LCS_Length(int[][] c,char[] X,char[] Y)
20: {
21: int m=X.length;
22: int n=Y.length;
23: return LCS_Memo(c,X,Y,m,n);
24: }
25:
26: static void printC(int[][] c) {
27: // TODO Auto-generated method stub
28: for (int i = 1; i < c.length; i++) {
29: for (int j = 1; j < c.length; j++) {
30: System.out.print(c[i][j] + "\t");
31: }
32: System.out.println();
33: }
34: }
35: /**
36: * @param args
37: */
38: public static void main(String[] args) {
39: // TODO Auto-generated method stub
40: String X = "BCDB";
41: String Y = "ABCBDAB";
42: char[] x = X.toCharArray();
43: char[] y = Y.toCharArray();
44:
45: int MAX = x.length>y.length?x.length+1:y.length+1;
46: int[][] c = new int[MAX][MAX];
47: System.out.println(LCS_Length(c,x,y));
48: printC(c);
49: }