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

    \(f(i,j)\)表示子序列\(a_i\)\(b_i\)的最长公共子序列的长度

    \(a_i = b_i\)时,找出\(a_{i-1}\)\(b_{i-1}\)的最长公共子序列,然后在其尾部加上\(a_i\)即可得到\(a\)\(b\)的最长公共子序列。

    \(a_i ≠ b_i\)时,求解两个子问题:

    • \(a_{i-1}\)\(b_i\)的最长公共子序列
    • \(a_i\)\(b_{i-1}\)的最长公共子序列

    然后取其中较大者。

    const int N=1010;
    char a[N],b[N];
    int f[N][N]//前一个字符串的前i位与后一个字符串的前j位的最长公共子序列长度 
    int n,m;
    
    int main()
    {
        cin>>n>>m;
    
        scanf("%s",a+1);
        scanf("%s",b+1);
    
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(a[i] == b[j]) f[i][j]=f[i-1][j-1]+1;
                else f[i][j]=max(f[i-1][j],f[i][j-1]);
    
        cout<<f[n][m]<<endl;
        //system("pause");
    }
    
  • 相关阅读:
    2.7 矩阵的秩
    HDU
    HDU
    HDU
    HDU
    HDU
    hdu 5179 beautiful number(数位dp)
    ACdream
    CodeForces
    <a>标签中 href="/" 和 hideFocus="true"
  • 原文地址:https://www.cnblogs.com/fxh0707/p/13747599.html
Copyright © 2011-2022 走看看