LIS例题

例一

求一组数的lis
f[i]为必选a[i]的lis长度

class Solution {
public:
    //low[i]代表长度为i的lis的结尾的最小值
    int LIS(vector<int>& a) {
        int n = a.size();
        int cnt = 0;
        vector<int> low(n + 1), f(n);
        for(int i = 0; i < n; i++) {
            int t = lower_bound(low.begin() + 1, low.begin() + cnt + 1, a[i]) - low.begin();
            f[i] = t;
            cnt = max(cnt, t);
            low[t] = a[i];
        }
        return cnt;
    }
};

例二circus-tower-lcci

定义x1<x2&&y1<y2时(x1,y1)<(x2,y2)
求(x,y)数组的lis

思路

第一维排序,第一维相同按第二维降序,求第二维的lis

例三pile-box-lcci

上例的三维版本,求合法序列的第三维的最大和

思路

按照第一维排序后答案必是排序后数组的子序列,对它用朴素方法dp
f[i]表示必选第i个时的最大高度
\(f_i=max(f_j)+a_i.third\)
\(j<i,a_j<a_j\)

posted @ 2021-01-12 21:25  wrjlinkkkkkk  阅读(93)  评论(0编辑  收藏  举报