问题描述
输入
输出
第一行一个整数k,表示最长公共合法事件序列的长度。
样例输入
5
1 4 2 5 1
4
1 1 2 4
样例输出
2
数据范围
算法讨论
f[i][j]为a到第i个位置,b到第j个位置最长的公共子串的长度,数据太水三个for过了……其实第三个for是可以优化掉的,在做j的时候记录一下前面最大的长度,然后直接转移就好了,比较懒就不贴优化后的代码了。
#include <cstdio>
using namespace std;
#define maxn 5006
int a[maxn],b[maxn],f[maxn][maxn];
int n,m,s;
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=1;i<=m;i++)
scanf("%d",&b[i]);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (a[i]!=b[j])
f[i][j]=f[i-1][j];
else
{
for (int k=1;k<j;k++)
if (b[k]<b[j])
f[i][j]=max(f[i][j],f[i-1][k]);
f[i][j]++;
}
s=max(s,f[i][j]);
}
printf("%d",s);
}
Pixiv ID:62242624