진 최적화 (DP), LIS | 겨울 6-C 오프 소

사고

최대 길이 시퀀스 증가
[I]는 서브 시퀀스로 표현 DP는의 i 번째 요소의 단부까지 상승하지 않고
반송 방정식 DP [I] = 최대 (DP [I], DP [J] + 1 (H [J 경우 ]> [I I-1 H ]) j∈1 ~
최적화 아이디어 : (DP)의 값 (여기서는 전방에 가능한 멀리 분명히 나은) Y이다 지칭 비교적 다수 같도록 많은 수의
모든 리드 D 어레이 분형 단조롭게 감소하도록 사용될 수있다

예를 들면 다음 그림은 최적화 된 LIS-절반의 도입을 보완 : 무단 전재 마늘 승객 수를

코드

#include<bits/stdc++.h>
using namespace std;

const int maxn = 100010;
int n;

struct node{
    int x,y;
    int pos;
}a[maxn];
int len = 0;
int d[maxn];
int b[maxn];

bool cmp(node u,node v){
    if(u.x == v.x) return u.y < v.y;
    return u.x < v.x;
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].x>>a[i].y;
        a[i].pos = i;
    } 
    sort(a+1,a+n+1,cmp);
    d[++len] = a[1].y;
    b[a[1].pos] = 1;
    for(int i=2;i<=n;i++){
        if(a[i].y < d[len]) d[++len] = a[i].y,b[a[i].pos] = len;
        else{
            //找第一个小于的 
            int pos = upper_bound(d+1,d+len+1,a[i].y,greater<int>()) - d;
            d[pos] = a[i].y;
            b[a[i].pos] = pos;
        }
    }
    cout<<len<<endl;
    for(int i=1;i<=n;i++) cout<<b[i]<<" ";
    return 0;
} 

추천

출처www.cnblogs.com/fisherss/p/12329747.html