题目链接:
https://www.luogu.com.cn/problem/P1233
题目大意:
有 n 根长度和宽度已知的木棒,现在要加工木棒,第一根木棒的准备时间是 1 分钟,如果处理完一根长为 L ,宽为 W 的木棒,下一根木棒的长 为 L1,宽度为 W1, 并且满足 L >= L1,W >= W1,这根木棒不需要准备时间,否则需要 1 分钟的准备时间,求处理完 n 根木棒所需的最短准备时间
思路:
首先可以想到按照长度由大到小 排序 ,在长度相同的情况下,宽度由大到小,问题就转化为求 不下降子序列 的个数,根据 dilworth 定理,不下降子序列最小个数 等于 最大上升子序列的长度 。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5010;
int n, ans, dp[maxn];
struct stick {
int l, w;
}s[maxn];
bool cmp(stick a, stick b){
if (a.l != b.l) return a.l > b.l;
return a.w > b.w;
}
int main(){
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d %d", &s[i].l, &s[i].w);
sort(s + 1, s + n + 1, cmp);
for (int i = 1; i <= n; i++){
for (int j = i - 1; j >= 1; j--)
if (s[i].w > s[j].w) dp[i] = max(dp[i], dp[j] + 1);
ans = max(ans, dp[i]);
}
cout << ans + 1 << "\n";
return 0;
}