LCS 问题

来源:互联网 发布:百度知道和知乎 编辑:程序博客网 时间:2024/06/10 18:21

给定两个字符串s1s2...sn和t1t2...tn。

求出这两个字符串的最长的公共子序列的长度。字符串s1s2...sn的子序列指可以表示为si1si2...sim 的序列

1<=n<=m


最近想好好搞搞dp 先从最简单的问题一点点开始吧!!

其中dp[i][j]表示s1-si 和t1-tj 的最长公共子序列的长度

转移方程就是如果他们的i+1位相同那么 dp[i+1][j+1]=dp[i][j]+1

否则 就是分别看他们之前的串那个LCS大。

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=1005;int dp[maxn][maxn];int n,m;char s1[maxn],s2[maxn];void solve(){    memset(dp,0,sizeof(dp));    for(int i=0;i<n;i++)    {        for(int j=0;j<m;j++)        {            if(s1[i]==s2[j]) dp[i+1][j+1]=dp[i][j]+1;            else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);        }    }    printf("%d\n",dp[n][m]);}int main(){    scanf("%d%d",&n,&m);    getchar();    gets(s1);    gets(s2);    solve();    return 0;}


0 0
原创粉丝点击