/**
*
* @author Administrator
*@version 2011.06.15
*动态规划法求最长公共子序列
*/
public class DPCommonSubstr {
/**
* @param args
*/
public static void main(String[] args) {
Object a[]={null,1,2,3,4,5,6,7};
Object b[]={null,1,2,3,-1,6,7,8};
MaxCommonSubSeq(a,b);
}
private static void MaxCommonSubSeq(Object a[],Object b[]){
int alen=a.length;
int blen=b.length;
//Object comm[] = new Object[alen];
//len[i][j]记录a的前i个序列与b的前j个学列的最长公共子序列长度
int len[][] = new int[alen][blen];
for(int i=0;i<alen;i++){
len[i][0]=0;
}
for(int j=0;j<blen;j++){
len[0][j]=0;
}
for(int i=1;i<alen;i++){
for(int j=1;j<blen;j++){
if(a[i]==b[j]){
len[i][j]=len[i-1][j-1]+1;
}
else{
len[i][j]=Math.max(len[i][j-1], len[i-1][j]);
}
}
}
System.out.println(len[alen-1][blen-1]);
}
}
分享到:
相关推荐
最长公共子序列(Longest Common ...总之,求最长公共子序列是一个典型的动态规划问题,它涉及到序列比较、状态转移和记忆化等概念。理解并掌握这一问题有助于深入理解动态规划思想,并能应用于实际的编程挑战中。
3. **结果获取**:最后,`dp[1-flag][m]`即为所求的最长公共子序列的长度。 **示例**: 假设`S1 = {a, b, c, d, e}`和`S2 = {b, d, a, a, a}`。 - 初始化:`dp[0][j] = 0`。 - 遍历: - `i = 1`时(`a`):`dp...
最后,我们通过回溯dp数组来构造最长公共子序列。在本例中,调用这个方法并传入X=ABCBDAB和Y=BDCABA会返回"BCBA"。 总结来说,最长公共子序列问题是一个典型的动态规划问题,通过使用C#编程语言,我们可以有效地...
最长公共子序列(Longest Common ...在C#中实现这一算法,可以有效地找到两个字符串之间的最长公共子序列长度。理解并掌握这一算法,对于提升编程能力,特别是在处理序列匹配和比较的问题时,是非常有价值的。
动态规划法求解最长公共子序列问题与0-1背包问题 本实验报告旨在通过动态规划法解决最长公共子序列问题和0-1背包问题,以深入理解动态规划方法的思想、求解策略及步骤。 实验目的 * 理解动态规划方法的核心思想和...
动态规划求解LCS的基本思路是构建一个二维数组dp,其中dp[i][j]表示字符串S的前i个字符和字符串T的前j个字符的最长公共子序列的长度。我们可以根据以下状态转移方程来填充dp数组: 1. 如果S的第i个字符与T的第j个...
初始状态下,dp[0,j] = dp[i,0] = 0,因为没有字符的公共子序列长度为0。然后,根据以下条件填充dp数组: - 如果两个字符相同,dp[i,j] = dp[i-1,j-1] + 1。 - 如果不同,dp[i,j] = max(dp[i-1,j], dp[i,j-1])。...
我们可以构建一个m+1行、n+1列的二维数组dp,其中dp[i][j]表示S1的前i个字符和S2的前j个字符的最长公共子序列的长度。初始化dp数组的边界条件:当i=0或j=0时,两个字符串之一为空,所以dp[i][j]=0。 接下来,我们...
否则,dp[i][j]取dp[i-1][j]和dp[i][j-1]中的较大值,表示不考虑当前字符时两个字符串的最长公共子序列长度。 4. **回溯路径**:当dp[m][n]即为所求的最长公共子序列的长度。为了获取这个子序列本身,可以从dp[m][n...
这个二维数组的大小为m+1×n+1,记为dp,其中dp[i][j]表示序列X的前i个元素和序列Y的前j个元素的最长公共子序列的长度。初始时,当i=0或j=0时,两序列中至少有一个为空,因此dp[i][j]=0。 动态规划的状态转移方程...
数组初始化时,dp 的边界条件是 dp[0][*] 和 dp[*][0] 都为 0,表示任何序列和长度为 0 的序列的最长公共子序列长度为 0。 4. 状态转移方程 动态规划方法的关键在于状态转移方程。对于 LCS 问题,状态转移方程如下...
对于最长公共子序列问题,我们可以定义一个二维数组dp,其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符的最长公共子序列的长度。 首先,我们需要初始化dp表格。当任一字符串为空时,最长公共子序列的...
更进一步地,如果存在这样的子序列C,它同时是字符串A和B的子序列,并且在长度上是所有这样的序列中最长的,那么C就被定义为A和B的最长公共子序列。 刘佳梅的研究成果在于她提出的算法不单准确无误地求得了LCS,...
2. 初始化动态规划数组:创建dp[m+1][n+1],所有边界条件设为0,即dp[0][j] = dp[i][0] = 0,因为空字符串的最长公共子序列长度为0。 3. 填充dp数组:根据上述状态转移方程填充数组。 4. 计算LCS长度:dp[m][n]即为...
1. 初始化:设置dp数组的第一行和第一列均为0,因为一个序列的最长公共子序列长度是它自身的长度,即当只有一个字符时,其LCS长度为1。 2. 遍历:对于dp数组中的每个元素,如果X的第i个字符和Y的第j个字符相同,则dp...
动态规划方法的核心思想是构建一个二维数组L,其中L[i][j]表示字符串S的前i个字符与字符串T的前j个字符的最长公共子序列的长度。状态转移方程如下: 如果S[i] == T[j],则L[i][j] = L[i-1][j-1] + 1; 否则,L[i][j...
4. 最后,dp[m][n]就是两个字符串的最长公共子序列的长度。要得到具体的子序列,可以从dp[m][n]出发,逆向回溯dp数组,找到对应的字符。 在给出的"最长公共子序列.cpp"文件中,可以看到实际的C语言代码实现。这个...
对于LCS问题,我们可以创建一个二维数组dp,其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符的最长公共子序列的长度。 以下是一个简单的LCS动态规划算法步骤: 1. 初始化:创建一个大小为m+1×n+1的二...