题解 | #最长公共子序列(一)#

最长公共子序列(一)

https://www.nowcoder.com/practice/672ab5e541c64e4b9d11f66011059498

设dp[i][j]表示

1~i的s1子串和1~j的s2子串的最长公共子序列的最大长度

思想:从哪里来

如果s1[i]==s2[j]了,那这个f[i][j] = max(f[i][j], f[i-1][j-1]+1)

如果s1[i]!=s2[j]

f[i][j] <-- max( f[i-1][j], f[i][j-1], f[i][j])

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int dp[N][N];  //长度为i的s1子串和长度为j的s2子串 的最长公共子序列
int main() {

    int n,m;
    scanf("%d%d",&n,&m);
    char s1[N];
    char s2[N];
    scanf("%s",(s1+1));
    scanf("%s",(s2+1));

    for(int i = 1;i<=n;i++)
    {
        for(int j = 1; j<=m;j++){
            dp[i][j] = max(dp[i][j], max(dp[i-1][j], dp[i][j-1]));
            if(s2[j]==s1[i]){
                dp[i][j] = max(dp[i][j], dp[i-1][j-1]+1);
            }

        }
    }
    printf("%d",dp[n][m]);
    return 0;                          
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务