Longest Common Subsequence(LCS)
一:暴力 O(n2)
数据太大 50分
#include <bits/stdc++.h>
using namespace std;
const int N=10e3+1;
int a1[2*N],a2[2*N],dp[N][N],n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a1[i];
}
for(int i=1;i<=n;i++)
{
cin>>a2[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(a1[i]==a2[j])
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
}
}
cout<<dp[n][n];
return 0;
}
二:状态压缩(一维数组)O(n2)
空间优化了,但时间还是O(n2),50分
#include <bits/stdc++.h>
using namespace std;
const int N=10e5+5;
int a1[N],a2[N],dp[N],n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a1[i];
}
for(int i=1;i<=n;i++)
{
cin>>a2[i];
}
int pre = 0;//111
for(int i=1;i<=n;i++)
{
pre = 0;//111
for(int j=1;j<=n;j++)
{
int t = dp[j];//111
if(a1[i]==a2[j])
dp[j]=pre + 1;
else
dp[j]=max(dp[j-1],dp[j]);
pre = t;//111
}
}
cout<<dp[n];
return 0;
}
三: P1439