zoukankan      html  css  js  c++  java
  • 最长公共子序列

    #include"iostream"
    #include"cstdio"
    #include"algorithm"
    #include"cstring"
    #define N 500
    using namespace std;
    int lcs[N][N];//lcs[x][y]表示 串1的第一位的到x,串2的第一位到y的最长子序列; 
    char s1[N],s2[N];
    int main()
    {
        while(~scanf("%s",s1))
        {  
            scanf("%s",s2);
            //cout<<s1<<" "<<s2<<endl;
            int l1=strlen(s1),l2=strlen(s2);
            for(register int i=0;i<=l1;++i)
              {
                  for(register int j=0;j<=l2;++j)
                 {
                        if(i==0||j==0)
                         lcs[i][j]=0;//初始化因为当lcs[0][0]  i=0,表示串1长度为0,当串1为0;不可能就有公共子序列(!!关键)                                 //同样 j=0,表示j=0,那么同样公共子序列为0; 
                       else if(s1[i-1]==s2[j-1])//因为先++l,但是字符串从0开始所应该判断是否s1[i-1],s2[j-1] 
                      {                         //意思是判断是串1 i-1位,串2 j-1位是否相同 
                      lcs[i][j]=lcs[i-1][j-1]+1;//如果相同那么当前状态的lcs[i][j]
                                                //就应该是两个串的前一个位置lcs[i-1][j-1]最长子序列+1;       
                      }
               
                     else 
                         lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);//如果是串1 i-1位与串2 j-1位,那么现在状态lcs[i][j]的
                                                             //最长子序列就应该由上个状态
                                                             //lcs[i-1][j]和lcs[i][j-1]中转移过来 
                  }
               }
         cout<<lcs[l1][l2]<<endl;//最后答案应该存在末状态中; 
       }
      return 0;
    }
     

    #include"iostream"#include"cstdio"#include"algorithm"#include"cstring"#define N 500using namespace std;int lcs[N][N];//lcs[x][y]表示 串1的第一位的到x,串2的第一位到y的最长子序列; char s1[N],s2[N];int main(){while(~scanf("%s",s1)){  scanf("%s",s2);//cout<<s1<<" "<<s2<<endl;int l1=strlen(s1),l2=strlen(s2);for(register int i=0;i<=l1;++i)  {      for(register int j=0;j<=l2;++j)     {        if(i==0||j==0)         lcs[i][j]=0;//初始化因为当lcs[0][0]  i=0,表示串1长度为0,当串1为0;不可能就有公共子序列(!!关键)          //同样 j=0,表示j=0,那么同样公共子序列为0;    else if(s1[i-1]==s2[j-1])//因为先++l,但是字符串从0开始所应该判断是否s1[i-1],s2[j-1]           {                         //意思是判断是串1 i-1位,串2 j-1位是否相同           lcs[i][j]=lcs[i-1][j-1]+1;//如果相同那么当前状态的lcs[i][j]                            //就应该是两个串的前一个位置lcs[i-1][j-1]最长子序列+1;             }            else          lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);//如果是串1 i-1位与串2 j-1位,那么现在状态lcs[i][j]的                                     //最长子序列就应该由上个状态 //lcs[i-1][j]和lcs[i][j-1]中转移过来           }       } cout<<lcs[l1][l2]<<endl;//最后答案应该存在末状态中;    }  return 0;} 

  • 相关阅读:
    Oracle中常见的33个等待事件小结
    DATAGUARD中手工处理日志v$archive_GAP的方法
    ORACLE 如何定位消耗资源的SQL
    ORACLE 全局索引和本地索引
    Oracle中获取执行计划的几种方法分析
    BUFFER CACHE之主要的等待事件
    查看tablespace实际使用量和剩余空间
    Linux环境配置文件的理解
    Shell 传递参数
    Linux开局配置注意事项
  • 原文地址:https://www.cnblogs.com/ltlt/p/9348427.html
Copyright © 2011-2022 走看看