【算法设计与分析】最长公共子序列(动态规划)

/**
 * 求最长公共子序列长度
 * @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);
	}
}

 

 

 

 

你可能感兴趣的:(算法设计与分析,算法,最长公共子序列,动态规划)