求两个序列的最大子序列问题:
这个算法也是《算法导论》讲 dp 的例子,
讲的是有两个序列 Xn 和 Ym ,假设 Zk 是他们的最大子列
可以证明:若 xn=ym ,则 xn 必然等于 zk ( easy )
若 xn ! =ym ,则 zk ! =xn 时, Z 是 xn-1 和 ym 的最大子列
或者 zk ! =ym 时, Z 是 xn 和 ym-1 的最大子列
(即:最后一个如果不在 z 的末尾,就可以移掉)
package zboDo;
public class LCS {
char [] X ;
char [] Y ;
int [][] C ;
public LCS() {
String xSource = "ABCDBA" ;
X = xSource.toCharArray();
String ySource = "BDCABA" ;
Y = ySource.toCharArray();
C = new int [ X . length +1][ Y . length +1];
for ( int i = 0; i <= X . length ; i++)
for ( int j = 0; j <= Y . length ; j++) {
if (i == 0 || j == 0) {
C [i][j] = 0;
} else {
C [i][j] = Integer. MIN_VALUE ;
}
}
}
public void test() {
int MaxLenght = getResult(6, 6);
System. out .print(MaxLenght);
}
public int getResult( int xLen, int yLen) {
if ( C [xLen][yLen] != Integer. MIN_VALUE ) {
return C [xLen][yLen];
}
else if ( X [xLen-1] == Y [yLen-1]) {
return getResult(xLen - 1, yLen - 1) + 1;
}
else
{
int maxWithoutLastX=getResult(xLen-1, yLen);
int maxWithoutLastY=getResult(xLen, yLen-1);
int longerOne=maxWithoutLastX>maxWithoutLastY?maxWithoutLastX:maxWithoutLastY;
C [xLen][yLen]=longerOne;
return longerOne;
}
}
}