zoukankan      html  css  js  c++  java
  • P1020 导弹拦截 /// DP Dilworth定理 LIS、LDS优化

    题目大意:

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

    Dliworth有两个互相对偶的定理:
    U的链划分使用的最少集合数,等于它的最大反链长度。(1)
    U的反链划分使用的最少集合数,等于它的最大链长度。(2)

    更详细的讲解

    #include <bits/stdc++.h>
    using namespace std;
    int a[100005];
    int dp1[100005],dp2[100005];
    int f1[100005],f2[100005];
    /// 将 对应长度的最后一位的下标 存入f1[] f2[]中
    /*  即若 2 2 4 3 对应下标为 0 1 2 3
        则长度为 1 2 3 时
        f[]对应为 f[1]   f[2]   f[3] 
                    0      1      3  
                    2      2 2    2 2 3
    */
    int main()
    {
        int k=0;
        while(~scanf("%d",&a[++k])) ;
        memset(f1,0,sizeof(f1)); memset(f2,0,sizeof(f2));
        int t1=0,t2=0;
        for(int i=1;i<k;i++) {
            dp1[i]=dp2[i]=1;
            for(int j=t1;j>0;j--) 
                if(a[f1[j]]>=a[i]) {
                    dp1[i]=j+1; break;
                }
            t1=max(t1,dp1[i]);
            if(!f1[dp1[i]]) f1[dp1[i]]=i;
            else if(a[f1[dp1[i]]]<a[i]) f1[dp1[i]]=i;
            for(int j=t2;j>0;j--)
                if(a[f2[j]]<a[i]) {
                    dp2[i]=j+1; break;
                }
            t2=max(t2,dp2[i]);
            if(!f2[dp2[i]]) f2[dp2[i]]=i;
            else if(a[f2[dp2[i]]]>a[i]) f2[dp2[i]]=i;
        }
        printf("%d
    %d
    ",t1,t2);
    
        return 0;
    }
    View Code
  • 相关阅读:
    参考资料来自 懒兔子 的公众号
    Etcd
    zookeeper 杂记
    十二五
    防火墙
    APScheduler
    docker管理工具protainer
    java学习笔记
    linux学习笔记1
    [POI2007]ZAP-Queries
  • 原文地址:https://www.cnblogs.com/zquzjx/p/9307284.html
Copyright © 2011-2022 走看看