首页 > 其他 > 详细

P4309 [TJOI2013]最长上升子序列

时间:2019-10-13 21:25:16      阅读:81      评论:0      收藏:0      [点我收藏+]

发现自己dp学的非常不好 所以开始练习dp

(当然从最简单的开始啦)


 

题目传送门

为什么这道题是个紫题??分明代码很简单(对于多数线段树树状数组的码量来看)

个人认为思路有点难想出来(我就是看了题解才会的)

步入正题

题目描述每次插入一个数k到xk位置(0<k<=n)

那么就是一个动态的啦

插入一个数k到xk位置后

对于区间(1,xk)已经在之前求解过最长子序列

那么只用找出(1,xk)区间内lis的最大值+1就可以了

然后更新(kx,n)

用树状数组就可以实现啦

具体看代码

 

#include<bits/stdc++.h>
using namespace std;
int ans[1000001],n,tree[1000001];
vector<int> a;
inline void updata(int x,int v){
    while(x<=n){
        tree[x]=max(tree[x],v);
        x+=x&-x;
    }
}
inline int query(int x){
    int t=0;
    while(x){
        t=max(t,tree[x]);
        x-=x&-x;
    }
    return t;
}
int main(){
    cin>>n;
    for(int i=1,t;i<=n;i++){
        scanf("%d",&t);
        a.insert(t+a.begin(),i);
    }
    for(int i=0,t;i<n;i++){
        t=a[i];
        updata(t,ans[t]=query(t)+1);
    }
    for(int i=1;i<=n;i++){
        printf("%d\n",ans[i]=max(ans[i],ans[i-1]));
    }
    return 0;
}

 

P4309 [TJOI2013]最长上升子序列

原文:https://www.cnblogs.com/duojiaming/p/11668111.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!