• 最长公共子序列问题 (LCS)


     给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度.

    输入:

    n=4

    m=4

    s="abcd"

    t="becd"

    输出:

    3("bcd")

    这类问题被称为最长公共子序列问题(LCS,Longest Common Subsequence)的著名问题.

                         max(dp[i][j]+1,dp[i][j+1],dp[i+1][j])   (s=t)

    dp[i+1][j+1]=

                          max(dp[i][j+1],dp[i+1][j])                  (其他)

    这个递推式可用O(nm)计算出来,dp[n][m]就是LCS的长度.

    ji

    0

    1{b}

    2{e}

    3{c}

    4{d}

    0

    0

    0

    0

    0

    0

    1{a}

    0

    0

    0

    0

    0

    2{b}

    0

    1

    1

    1

    1

    3{c}

    0

    1

    1

    2

    2

    4{d}

    0

    1

    1

    2

    3

     1 int n,m;
     2 char s[MAX],t[MAX];
     3 int dp[MAX][MAX];   //DP数组
     4 
     5 void solve()
     6 {
     7     for(int i=0; i<=n; i++){
     8         for(int j=0; j<=m; j++){
     9             if(s[i]==t[j]){
    10                 dp[i+1][j+1]=dp[i][j]+1;
    11             }
    12             else{
    13                 dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
    14             }
    15         }
    16     }
    17     printf("%d
    ",dp[n][w]);
    18 }

    <<挑战程序设计竞赛>>读后感

  • 相关阅读:
    js dom
    js Number string
    jq ajax数据交互
    js date 和 math
    js中英文网页切换
    日常使用
    php求和
    empty()
    时间戳、日期相互转换
    数组转字符串之间相互转换
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/5232221.html
Copyright © 2020-2023  润新知