public class LCSProblem
{
public static void main(String[] args)
{
String[] x = {"","A", "B", "C", "B", "D", "A", "B"};
String[] y = {"","B", "D", "C", "A", "B", "A"};
char[][] b = getLCSLength(x, y);
display(b, x, x.length -1, y.length - 1);
} //B C B A
public static char[][] getLCSLength(String[] x, String[] y)
{
char[][] b = new char[x.length][y.length];
int[][] c = new int[x.length][y.length];
for(int i=1; i< x.length; i++)
{
for(int j=1; j< y.length; j++)
{
if(x[i] == y[j])
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = '↖';
}
else if(c[i-1][j] >= c[i][j-1])
{
c[i][j] = c[i-1][j];
b[i][j] = '↑';
}
else
{
c[i][j] = c[i][j-1];
b[i][j] = '←';
}
}
}
for(int i=0; i < x.length; i++){
for(int j=0; j < y.length; j++)
System.out.print(c[i][j]+" ");
System.out.println();
}
return b;
}
public static void display(char[][] b, String[] x, int i, int j)
{
if(i == 0 || j == 0)
return;
if(b[i][j] == '↖')
{
display(b, x, i-1, j-1);
System.out.print(x[i] + " ");
}
else if(b[i][j] == '↑')
{
display(b, x, i-1, j);
}
else
{
display(b, x, i, j-1);
}
}
}
分享到:
相关推荐
总的来说,LCS问题和动态规划法的结合展示了如何运用编程技巧解决实际问题。理解这种算法不仅可以帮助我们解决字符串处理的问题,还能加深对动态规划这一核心算法的理解,为其他复杂问题的求解打下基础。在C++中实现...
实验3主要探讨了动态规划算法在解决实际问题中的应用,特别是针对两个核心问题:最长公共子序列(LCS)问题和最大子段和问题。动态规划是一种强大的算法设计策略,它通过将复杂问题分解为更小的子问题来求解,并存储...
在这个问题中,目标是找到两个给定字符串(`a`和`b`)的最长公共字符串子序列,即在不改变字符顺序的情况下,两个字符串中都存在的最长子序列。 `First_Born_SubStr_Len`函数是计算两个字符串的最长公共子序列长度...
动态规划是解决此问题的标准方法,通常构建一个二维数组来存储子问题的解,从而找到最长子序列的长度。 动态规划的核心在于理解问题的结构,构造合适的状态转移方程,并有效地存储中间结果以避免重复计算。这种思想...
最长公共子序列(Longest Common Subsequence,LCS)问题是计算机科学中一个经典的字符串处理问题,它寻找两个序列之间的最长子序列,这个子序列不必连续但必须保持原序列的相对顺序。在本例中,提供的文件是使用C++...
最长公共子序列(Longest Common Subsequence, LCS)是计算机科学中一种经典的字符串处理问题,主要应用于比较和分析两个序列的相似性。本问题的核心在于寻找两个给定序列中的最长子序列,该子序列并不需要连续,但...
这段代码实现了基于动态规划的LCS算法,能够正确输出两个字符串的最长公共子序列的长度。 #### 四、应用场景 LCS算法广泛应用于各种场景,包括但不限于: - **文本编辑器**: 在实现自动补全、拼写检查等功能时。 -...
动态规划的核心是“最优子结构”和“重叠子问题”。最优子结构是指一个问题的最优解包含其子问题的最优解;重叠子问题则是指在解决问题的过程中,会反复遇到相同的子问题。通过存储并利用子问题的解,我们可以避免...
### 南京邮电大学算法分析与设计实验二(动态规划法) #### 实验背景与目标 本实验属于南京邮电大学计算机学院开设的“算法分析与设计”课程的一部分,旨在通过具体实践加深学生对动态规划这一算法设计技巧的理解...
动态规划解不同的子序列**:此题考查如何利用动态规划找到两个字符串之间的最长子序列,涉及的技巧包括状态定义、状态转移方程等。 - **626. 买卖股票的最佳时机 III**:本题考察如何利用动态规划策略,在有限次...
动态规划是一种在计算机科学和数学中广泛使用的算法设计方法,主要应用于解决最优化问题。它通过将复杂问题分解成子问题来求解,通常这些子问题是重叠的,并且求解过程中会避免重复计算,从而达到高效求解的目的。...
5. **最短编辑距离**:计算将一个字符串转换为另一个字符串所需的最少单字符操作次数,包括插入、删除和替换。 6. **矩阵链乘法**:动态规划可以找到最小代价的矩阵乘法顺序。 7. **最长递增子序列(LIS)**:在...
3. 最长子序列:比如PKU2533题目,找出两个字符串的最长公共子序列,同样可以通过动态规划求解。 在实际应用中,动态规划不仅能够解决理论上的问题,还能在很多实际场景下找到最优解决方案,例如资源分配、路径规划...
1. **动态规划法**: 动态规划是一种解决复杂问题的有效策略,通过将问题分解为子问题并存储中间结果,避免了重复计算。对于LCS问题,我们可以创建一个二维数组dp,其中dp[i,j]表示序列1的前i个字符和序列2的前j个...
此外,LCS 问题也可以通过其他算法解决,如自底向上的迭代法或使用启发式搜索策略,但动态规划方法通常是最直观且易于理解的。 总之,求最长公共子序列是一个典型的动态规划问题,它涉及到序列比较、状态转移和记忆...
在这个问题中,给定两个字符串或字符序列A和B,目标是找到这两个序列的最长子序列,这个子序列既在A中也出现在B中,但不必连续。下面我们将深入探讨如何使用动态规划法来解决这个问题。 首先,我们需要理解字符序列...
总的来说,动态规划是一种强大的算法思想,它能够解决一系列复杂问题,从最短路径到背包问题,再到字符串匹配等。掌握动态规划的基本概念、适用范围和解决策略,对于任何IT专业人士来说都是一项重要的技能,因为它在...
动态规划是一种在计算机科学中广泛...它们不仅提供了理论上的理解,还在实际编程中有着广泛应用,如在数据结构优化、字符串处理、图论问题等众多领域。通过理解和掌握这些算法,开发者可以更好地应对复杂的计算挑战。
第一重循环确定第一个字符串的对齐位置,第二重循环确定第二个字符串的对齐位置,每次循环确定一组两个字符串的对齐位置,并从此对齐位置开始匹配两个字符串的最长子串,如果匹配到的最长子串比已知的最长子串长,则...
5. **找最长子字符串**: - 找到字符串中最长的子字符串,可能涉及到滑动窗口、动态规划或双指针技术。具体实现取决于题目要求,例如最长公共子串、最长回文子串等。 6. **字符串转换为整数**: - C语言标准库...