繁体   English   中英

大弦的最长共同子序列?

[英]longest common subsequence of bigger strings?

如果每个字符串的长度都大于60000,那么我尝试使用两个数组,因为我无法声明类似dp [60000] [60000] ..的数组,所以这就是为什么我尝试这样做但超过了时间限制的原因。 ..如何处理更长的时间。.在3到5秒的时间内有没有办法?

#include<iostream>
#include<cstring>
#include<string.h>
#include<algorithm>
using namespace std;
const int size=50000;
int dp_x[size+1],dp_xp1[size+1];
char a[size+1],b[size+1];
int lcs()
{
    int strlena=strlen(a);
    int strlenb=strlen(b);
    for(int y=0;y<=strlenb;y++)
        dp_x[y]=0;
    for(int x=strlena-1;x>=0;x--)
    {
        memcpy(dp_xp1,dp_x,sizeof(dp_x));
        dp_x[strlenb]=0;
        for(int y=strlenb-1;y>=0;y--)
        {
            if(a[x]==b[y])
                dp_x[y]=1+dp_xp1[y+1];
            else
                dp_x[y]=max(dp_xp1[y],dp_x[y+1]);
        }
    }
    return dp_x[0];
}
int main()
{
    while(gets(a)&&gets(b))
    {
        int ret=lcs();
        cout<<ret<<endl;
    }
}

在每次迭代中,你memcpy “荷兰国际集团一行。 每次迭代需要O(n)时间,因此总共需要O(n²)时间。 用指针交换替换memcpy 因此, dp_x1直接处理dp_xdp_x1dp_x dp_x1使用两个指针:

int *current = dp_x, previous = dp_x1;

然后,在循环内部,用交换替换副本:

std::swap(current, previous);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM