例一
求一组数的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)