如果每个字符串长度大于60000然后我尝试使用两个数组,因为我无法声明像dp [60000] [60000]的数组..所以这就是为什么我尝试这样但是时间限制超出...如何做更长的srings..The有什么办法在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;
}
}
答案 0 :(得分:1)
在每次迭代中,你都是memcpy
一行。每次迭代需要O(n)次,因此总共需要O(n²)时间。用指针交换替换memcpy
。因此,不是直接使用dp_x
和dp_x1
,而是最初使用两个指针:
int *current = dp_x, previous = dp_x1;
然后,在循环中,用swap替换副本:
std::swap(current, previous);