用结构体排序
将木棍的某一属性按照从大到小的顺序进行排列(长度优先)
需要注意的是,如果在两根木棍长度相等的情况下,必须要按宽度排序
在排序后,我们直接可以扔到这个长度不管了,直接把宽度跑一遍最长不上升子序列,得出最长不上升子序列的个数。但是我们知道,最长不上升子序列的个数等于最长上升子序列的长度,
struct Stick {
int l, w;
}t[5050];
// 首先定义一个结构体,存放木棍的长度和宽度.
int n, dp[5050];
// 然后定义木棍的数量 n 和 dp 数组.
bool cmp(Stick, Stick);
int main() {
// freopen("1.in", "r", stdin);
cin >> n;
for(int i = 1; i <= n; ++i) cin >> stick[i].l >> stick[i].w;
sort(stick + 1, stick + 1 + n, cmp);
dp[1] = stick[1].w;
. int k = 1;
for(int i = 2, j; i <= n; ++i) j = lower_bound(dp + 1, dp + k + 1, stick[i].w) - dp, j <= k ? dp[j] = stick[i].w : dp[++k] = stick[i].w;
cout << k << '\n', exit(0);
}
bool cmp(Stick a, Stick b) {//排序函数长相等就用宽排
if(a.l != b.l) return a.l > b.l;
return a.w > b.w;