[tyvj 1071] LCIS {最长公共上升子序列}

题目

https://www.luogu.org/problemnew/show/SP15637


结题思路

这道题时 LIS L I S LCS L C S 的综合。在根据这两种线性动态规划想出的三重循环的dp中,我们把满足 0k<j,Bk<Ak 0 ≤ k < j , B k < A k k k 构成的集合称为F[i,j]进行状态转移时的决策集合,记为 S(i,j) S ( i , j ) 。注意到,在第二层循环 j j 从1增加到m,第一层循环 i i 是一个定值,这使得条件Bk<Ai是固定的。因此,当变量 j j 增加1时,k的取值范围从 0k<j 0 ≤ k < j 变为 0k<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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值