Common Subsequence(hdu 1159)

LCS模板题。刚开始令maxn=1e4,爆内存,时间上优化需要用到后缀数组(表示还没学……),空间上优化可采纳滚动数组的用法

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3;//maxn=1e4会内存超限
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main()
{
    while(scanf("%s%s",a,b)==2)
    {
        memset(dp,0,sizeof(dp));
        int lena=strlen(a),lenb=strlen(b);
        for(int i=1;i<=lena;i++)
        {
            for(int j=1;j<=lenb;j++)
            {
                if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        printf("%d\n",dp[lena][lenb]);
    }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4;
char a[maxn],b[maxn];
int dp[2][maxn];
int main()
{
    while(scanf("%s%s",a,b)==2)
    {
        memset(dp,0,sizeof(dp));
        int lena=strlen(a),lenb=strlen(b);
        int flag=1;
        for(int i=1;i<=lena;i++)
        {
            for(int j=1;j<=lenb;j++)
            {
                if(a[i-1]==b[j-1]) dp[flag][j]=dp[!flag][j-1]+1;
                else dp[flag][j]=max(dp[!flag][j],dp[flag][j-1]);
            }
            flag=!flag;
        }
        printf("%d\n",dp[!flag][lenb]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/80287795