Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度。
Dilworth定理的对偶定理:对于一个偏序集,其最少反链划分数等于其最长链的长度。
也就是说把一个数列划分成最少的最长不升子序列的数目就等于这个数列的最长上升子序列的长度。(记住就好 hhhh~一篇解释博客)
所以就变成将l排序如果l相等就按w排序,最终求w最长下降子序列长度了
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 5000;
const int INF = 0x3f3f3f3f;
struct Stick {
int l, w;
bool operator< (const Stick& b)
{
return (l != b.l) ? (l > b.l) : (w > b.w);
}
};
int main(void)
{
int t, n;
Stick s[N];
int dp[N];
cin >> t;
while (t--) {
cin >> n;
fill(dp, dp+n, INF);
for (int i = 0; i < n; i ++)
scanf("%d%d", &s[i].l, &s[i].w);
sort(s, s+n);
for (int i = 0; i < n; i ++) {
*lower_bound(dp, dp+n, s[i].w) = s[i].w;
}
printf("%d\n", lower_bound(dp, dp+n, INF) - dp);
}
return 0;
}