模拟赛33 T2incr(luogu p3902 递增)

Posted duojiaming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟赛33 T2incr(luogu p3902 递增)相关的知识,希望对你有一定的参考价值。

传送门

然而考试的时候并没有看出来是线性dp


 

那么复习一下线性dp lis问题

LIS 最长上升子序列

可以用dp求解 复杂度O(n^2)

定义dp[i] 表示a[i]为结尾的“最长上升子序列”的长度

转移方程 dp[i]=max{dp[j]+1} (0<=j<i,a[j]<a[i])

边界也很好理解 就是dp[0]=0

那么目标就是max{dp[i]}

 


 

那么这道题就可以找到最长上升子序列的个数

用总个数减最长上升子序列去的个数 就是答案

具体看代码

 

#include<bits/stdc++.h>
using namespace std;
int n,len;
const int mxn=100005;
int a[mxn],dp[mxn];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        a[i]-=i;
    }
    dp[++len]=a[1];
    for(int i=2;i<=n;i++){
        if(dp[len]<=a[i]) dp[++len]=a[i];
        else{
            int k=lower_bound(dp+1,dp+len+1,a[i])-dp;//二分查找第一个大于等于a[i]的元素位置 
//            cout<<dp<<" "<<lower_bound(dp+1,dp+len+1,a[i]);
            dp[k]=a[i]; 
        } 
    }
    cout<<n-len;
    return 0;
}

 

以上是关于模拟赛33 T2incr(luogu p3902 递增)的主要内容,如果未能解决你的问题,请参考以下文章

Luogu关卡2-1简单的模拟(2017年10月)

Luogu 1008 三连击

Luogu3936 Coloring(模拟退火)

[Luogu]5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III[分块]

Luogu P2827 蚯蚓(模拟)

$Luogu2512/CH122 AcWing122$糖果传递 模拟