#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#define A "xyxxzxyzxy"
#define B "zxzyyzxxyxxz"
void output(char str[])
{
for(int i=0;i<strlen(str);i++)
cout<<str[i]<<" ";
cout<<"\n";
}
int main(void)
{
char strA[] = {A};
char strB[] = {B};
int solution[strlen(A)+1][strlen(B)+1];
output(strA);
output(strB);
for(int i=0;i<=strlen(A);i++)
{
for(int j=0;j<=strlen(B);j++)
solution[i][j] = 0;
}
for(int i=1;i<=strlen(A);i++)
{
for(int j=1;j<=strlen(B);j++)
{
if(strA[i-1] == strB[j-1])
{
solution[i][j] = solution[i-1][j-1] + 1;
if(i == j)
cout<<"strA"<<i-1<<strA[i-1]<<" ";
}
else if(solution[i-1][j]>solution[i][j-1])
{
solution[i][j] = solution[i-1][j];
}
else
solution[i][j] = solution[i][j-1];
}
}
for(int i=0;i<=strlen(A);i++)
{
for(int j=0;j<=strlen(B);j++)
cout<<solution[i][j]<<" ";
cout<<"\n";
}
cout<<"Max Length:"<<solution[strlen(A)][strlen(B)]<<"\n";
int i = 1;
int j = 1;
cout<<"One LCS is :";
while(i<=strlen(A) && j<=strlen(B))
{
if(strA[i-1] == strB[j-1])
{
cout<<strA[i-1]<<" ";
i++;
j++;
}
else if(solution[i+1][j]>solution[i][j+1])
{
i++;
}
else
j++;
}
cout<<"\n";
system( "PAUSE ");
return 0;
}
需注意的地方是,循环的顺序。
分享到:
相关推荐
"最长公共子序列"(Longest Common Subsequence, LCS)是计算机科学中一个经典的问题,主要涉及算法和数据结构领域,特别是在文本处理、生物信息学和版本控制系统中有广泛应用。在这个实际应用案例中,我们将深入...
2. **最长公共子序列(LCS)**:LCS 是两个序列中最长的、不改变顺序的公共子序列,但不一定是连续的。解决 LCS 问题的动态规划方法基于构建一个二维矩阵,其中每个单元格 (i, j) 表示两个序列前 i 个和前 j 个字符的...
为了优化这个递归算法,我们可以使用动态规划(Dynamic Programming)方法,构建一个二维数组LCS[][],其中LCS[i][j]表示X的前i个字符和Y的前j个字符的最长公共子序列的长度。状态转移方程如下: 1. LCS[i][0] = 0...
在这个项目中,我们主要关注两个经典的算法:最长公共子序列(Longest Common Subsequence, LCS)和Floyd-Warshall算法。这两个算法都是在计算机科学领域中解决特定问题的重要工具,尤其是在图论和序列比对方面。 ...
最长公共子序列(Longest Common Subsequence,LCS)问题是动态规划的经典应用之一,主要目标是找到两个序列X和Y的最长子序列,该子序列在原序列中不必连续但必须保持原有顺序。这个问题在文本比较、生物信息学等...
除了数字三角形问题,动态规划还广泛应用于其他经典问题,如最长上升子序列(LIS)、Help Jimmy问题、最长公共子序列(LCS)以及购物问题等。最长上升子序列问题寻找一个数组中非降序子序列的最大长度,可以通过维护...
最长公共子序列问题(LCS)旨在找出两个序列的最长子序列,该子序列在两个序列中都是相同的,但不必连续。 - **动态规划方法**:通过建立一个二维数组,其中每个元素表示两个序列前i个字符和前j个字符的最长公共子...
2. **最长公共子序列(LCS)**:寻找两个序列的最长子序列,其中子序列的元素在原序列中保持相对顺序,但不一定连续。 3. **最短路径问题**:如Dijkstra算法和Floyd-Warshall算法,用于找到图中的最短路径。 4. **...
2. 最长公共子序列(LCS):寻找两个序列的最长子序列,它们在原序列中可能不连续。 3. 最短路径问题:如Floyd-Warshall算法用于求解所有顶点对之间的最短路径,Dijkstra算法和Bellman-Ford算法则适用于有向图或无向...
- 最长公共子序列(LCS):找到两个序列共有最长子序列的问题。 - 每对结点的最短路径:在一个图中找到每对顶点之间的最短路径。 - 投资问题:确定最优的投资策略,使利润最大化。 - 最优二叉搜索树:构建一种二叉...
- **最长公共子序列(LCS)**:寻找两个序列的最长子序列,它在两个序列中都出现,通常使用二维动态规划求解。 3. **图论**: - **拓扑排序**:对于无环有向图,拓扑排序可以确定节点的顺序,使得对于每条有向边u...
2. 最长公共子序列(LCS):找到两个序列的最长子序列,不需连续。 3. 矩阵链乘法:通过计算最优括号组合,降低矩阵相乘的运算次数。 4. 状态转移方程:如斐波那契数列,使用动态规划避免重复计算。 五、字符串算法...
- 最长公共子序列(LCS):寻找两个序列的最长子序列,不需连续。 -斐波那契数列:递归或备忘录法求解,如计算兔子繁殖问题。 5. **贪心算法**: -霍夫曼编码:通过贪心选择构建最优前缀码,用于数据压缩。 -...
4. **LCS(最长公共子序列)**:用于找出两个序列之间的最长子序列,这在比较文本相似性时很有用。 5. **生成最大公共子串**:LCS的拓展,找出实际的子串而不是仅其长度。 6. **数字转化为字符**:将数字转换为...
- **最长公共子序列(LCS)**:找到两个序列间的最长子序列,不需连续但顺序相同。 4. **递归与分治策略**: - **递归**:函数调用自身解决问题的方法,如计算阶乘、汉诺塔问题等。 - **分治策略**:将大问题分解...