标签:偏序 关系 int 1065 ++ POJ stick dp
POJ 1065
贪心、偏序集、Dilworth定理、最长下降子序列
说到偏序集,在离散里的定义是:
设R为非空集合A上的关系,如果R是自反的、反对称的和传递的,则称R为A上的偏序关系,简称偏序,记作≤。
- 偏序是在集合X上的二元关系≤(这只是个抽象符号,不是“小于或等于”),它满足自反性、反对称性和传递性。即,对于X中的任意元素a,b和c,有:
- 自反性:a≤a;
- 反对称性:如果a≤b且b≤a,则有a=b;
- 传递性:如果a≤b且b≤c,则a≤c 。
-
带有偏序关系的集合称为偏序集。
-
令(X,≤)是一个偏序集,对于集合中的两个元素a、b,如果有a≤b或者b≤a,则称a和b是可比的,否则a和b不可比。
在X中,对于元素a,如果任意元素b,由b≤a得出b=a,则称a为极小元。 -
一个反链A是X的一个子集,它的任意两个元素都不能进行比较。
-
一个链C是X的一个子集,它的任意两个元素都可比。
-
任何集合A上的恒等关系,集合的幂集P(A)上的包含关系,实数集上的小于等于关系,正整数集上的整除关系等都是偏序关系。
我们假设当L1<=L2且W1<=W2时,才有(L1, W1)<=(L2, W2),那么我们可以发现这个关系属于偏序关系,因为满足三个条件:自反性、反对称性和传递性。那么我们就可以使用上述链接中提到的内容:最小数目的链的划分与最大反链的集合大小相同,于是这道题变成了求最大反链。在这里,反链即为不满足上述关系的,所以我们先对L进行从小到大的排序,L相同则按W从小到大排序,那么W的最大下降子序列则为最大反链。
说明 题目给出的 (L1, W1)<=(L2, W2) 是满足偏序关系的,那么本题所求的以 <= 连接的最少划分数, 就等于 < 连接的最长子序列。
解法中先进行了排序,保证按照序列顺序比较时 L 这一维度不会成为 “满足偏序关系” 这一要求的负担,可以只关注于 w 这一维度。
以上是复杂的证明,解法很简答:
1, 双关键字排序、
2, 按照 w 维度求最长下降子序列的长度。
总结:Dilworth定理:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int T;
int n;
struct STICK {
int l, w;
} stick[N];
int dp[N];
bool cmp(STICK a, STICK b) {
if (a.l == b.l)
return a.w < b.w;
return a.l < b.l;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &stick[i].l, &stick[i].w);
}
sort(stick, stick + n, cmp);
// 不能每次初始化所有的数组,n^2的复杂度会超时
memset(dp, -1, n * sizeof(int));
// 通过排序将问题转化为一维最长下降子序列问题。
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j ++) {
if (j == 0 || dp[j - 1] > stick[i].w) {
dp[j] = max(dp[j], stick[i].w);
}
}
}
cout << lower_bound(dp, dp + n, -1, greater<int>()) - dp << endl;
}
return 0;
}
对于DP过程优化的写法:
for (int i = 0; i < n; ++i)
{
*lower_bound(dp, dp + n, stick[i].second, greater<int>()) = stick[i].second;
}
参考了以下两个博客:
https://blog.csdn.net/u011008379/article/details/50725927
https://www.hankcs.com/program/cpp/poj-1065-wooden-sticks.html
标签:偏序,关系,int,1065,++,POJ,stick,dp 来源: https://www.cnblogs.com/superPG/p/16260998.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。