题目
https://www.luogu.org/problemnew/show/SP15637
结题思路
这道题时 LIS L I S 与 LCS L C S 的综合。在根据这两种线性动态规划想出的三重循环的dp中,我们把满足 0≤k<j,Bk<Ak 0 ≤ k < j , B k < A k 的 k k 构成的集合称为进行状态转移时的决策集合,记为 S(i,j) S ( i , j ) 。注意到,在第二层循环 j j 从1增加到,第一层循环 i i 是一个定值,这使得条件是固定的。因此,当变量 j j 增加1时,的取值范围从 0≤k<j 0 ≤ k < j 变为 0≤k<j+1 0 ≤ k < j + 1 。所以,只需要两重循环即可求解。
代码
#include<cstdio>
#include<algorithm>
#define rep(i,x,y) for (register int i=x;i<=y;i++)
using namespace std;
int n,a[4001],b[4001],f[4001][4001],ans;
int main()
{
scanf("%d",&n);
rep(i,1,n) scanf("%d",&a[i]);
rep(i,1,n) scanf("%d",&b[i]);
rep(i,1,n)
{
int val=0;
rep(j,1,n){
if (a[i]==b[j]) f[i][j]=val+1; else f[i][j]=f[i-1][j];
if (b[j]<a[i]) val=max(val,f[i-1][j]);
}
}
rep(j,1,n) ans=max(ans,f[n][j]);
printf("%d",ans);
}