`
Lisajoy512
  • 浏览: 10206 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

LCS最长公共子序列(输出一条最长子序列)

LCS 
阅读更多
#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 个字符的...

    最大公共子序列,实现公共子序列算法 with c sharp

    为了优化这个递归算法,我们可以使用动态规划(Dynamic Programming)方法,构建一个二维数组LCS[][],其中LCS[i][j]表示X的前i个字符和Y的前j个字符的最长公共子序列的长度。状态转移方程如下: 1. LCS[i][0] = 0...

    Floyd-And-LCS:使用动态编程方法实现最长公共子序列(LCS)算法,并创建无向完整图,编写程序以使用Floyd算法查找所有对最短路径。 打印所有线对的最短路径及其长度

    在这个项目中,我们主要关注两个经典的算法:最长公共子序列(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算法则适用于有向图或无向...

    算法设计策略 - 07 动态规划.pdf

    - 最长公共子序列(LCS):找到两个序列共有最长子序列的问题。 - 每对结点的最短路径:在一个图中找到每对顶点之间的最短路径。 - 投资问题:确定最优的投资策略,使利润最大化。 - 最优二叉搜索树:构建一种二叉...

    常见算法代码(全).docx

    - **最长公共子序列(LCS)**:寻找两个序列的最长子序列,它在两个序列中都出现,通常使用二维动态规划求解。 3. **图论**: - **拓扑排序**:对于无环有向图,拓扑排序可以确定节点的顺序,使得对于每条有向边u...

    经典算法Java实现

    2. 最长公共子序列(LCS):找到两个序列的最长子序列,不需连续。 3. 矩阵链乘法:通过计算最优括号组合,降低矩阵相乘的运算次数。 4. 状态转移方程:如斐波那契数列,使用动态规划避免重复计算。 五、字符串算法...

    Python 算法集.zip

    - 最长公共子序列(LCS):寻找两个序列的最长子序列,不需连续。 -斐波那契数列:递归或备忘录法求解,如计算兔子繁殖问题。 5. **贪心算法**: -霍夫曼编码:通过贪心选择构建最优前缀码,用于数据压缩。 -...

    ACM小组内部预定函数(详细)

    4. **LCS(最长公共子序列)**:用于找出两个序列之间的最长子序列,这在比较文本相似性时很有用。 5. **生成最大公共子串**:LCS的拓展,找出实际的子串而不是仅其长度。 6. **数字转化为字符**:将数字转换为...

    git-java-coursera-algorithms:Coursera 课程中的问题

    - **最长公共子序列(LCS)**:找到两个序列间的最长子序列,不需连续但顺序相同。 4. **递归与分治策略**: - **递归**:函数调用自身解决问题的方法,如计算阶乘、汉诺塔问题等。 - **分治策略**:将大问题分解...

Global site tag (gtag.js) - Google Analytics