题目链接:

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;
}