zoukankan      html  css  js  c++  java
  • 51nod 1006 最长公共子序列Lcs(dp+string,无标记数组实现)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
    收藏
    关注
    取消关注
    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
     
    比如两个串为:
     
    abcicba
    abdkscab
     
    ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
    Input
    第1行:字符串A
    第2行:字符串B
    (A,B的长度 <= 1000)
    Output
    输出最长的子序列,如果有多个,随意输出1个。
    Input示例
    abcicba
    abdkscab
    Output示例
    abca

    设dp[i][j]表示字符串a的前i个字符与字符串b的前j个字符的最长公共子序列长度。
    状态转移方程:dp[i][j]=a[i-1]==b[j-1]?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);
    边界条件dp[0][x]=dp[x][0]=0;

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 int dp[1005][1005]={0};
     5 string a,b;
     6 int la,lb;
     7 void lcs(int n,int m)
     8 {
     9     for(int i=1;i<=n;i++)
    10         for(int j=1;j<=m;j++)
    11         dp[i][j]=a[i-1]==b[j-1]?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);
    12 }
    13 void output()
    14 {
    15     string ans;
    16     int i=la,j=lb,len=dp[la][lb];
    17     while(dp[i][j])
    18     {
    19         if(a[i-1]==b[j-1])
    20             ans.push_back(a[i-1]),i--,j--;
    21         else if(dp[i][j]==dp[i-1][j])
    22             i--;
    23         else if(dp[i][j]==dp[i][j-1])
    24             j--;
    25     }
    26     for(int i=len-1;i>=0;i--)
    27         cout<<ans[i];
    28     cout<<endl;
    29 }
    30 int main()
    31 {
    32     ios::sync_with_stdio(false);
    33     cin>>a>>b;
    34     la=a.size(),lb=b.size();
    35     lcs(la,lb);
    36     output();
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    Lucene
    coreseek
    Sphinx学习之sphinx的安装篇
    在Hive中使用Avro
    Hive中实现group concat功能(不用udf)
    Fresnel Reflection
    安装Windows更新程序遇到错误:0x80070422
    float4与half4数据类型
    Dijkstra算法(三)之 Java详解
    地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
  • 原文地址:https://www.cnblogs.com/onlyli/p/7274055.html
Copyright © 2011-2022 走看看