/**
* 求最長公共子序列長度
* @author 劉劉
*/
public class LcsLength {
public static int lcsLength(char []x,char []y){
int m = x.length-1;//3
int n = y.length-1;//5
int [][]c = new int[m+1][n+1]; // c[i][j]存儲了Xi和Yj的最長公共子序列的長度
for(int i = 1;i <= m;++i) c[i][0] = 0; // Y序列爲空時的最長序列
for(int i = 1;i <= n;++i) c[0][i] = 0; // X序列爲空時的最長序列
for(int i = 1;i <= m;++i){
for(int j = 1;j <= n;++j){
if(x[i] == y[j]){ // 對應相等
c[i][j] = c[i-1][j-1]+1; // 子問題劃分,公共序列+1
}else if(c[i-1][j] >= c[i][j-1]){ // 對應不相等
c[i][j] = c[i-1][j]; // 比較X[i-1]和Y[j]
}else{
c[i][j] = c[i][j-1]; // 比較X[i]和Y[j-1]
}
}
}
return c[m][n]; // 最大公共子序列
}
public static void main(String[] args) {
char []x = {'0','B','C','D'}; // 從序號1開始比較
char []y = {'0','A','B','D','C','D'};
int n = lcsLength(x, y);
System.out.println(n);
}
}