Dilworth定理

内容

Dilworth定理是定义在偏序集上的。所谓偏序集,就是对于一个集合A,给定比较关系p(如,等),若其满足以下三个条件,则pA被称为一个偏序集:

  • 自反性:a p a
  • 反对称性:若a p b,b p a,那么a=b
  • 传递性:若a p b,b p c,则a p c

我们定义:

  • 链:指一个偏序集合SA,它的任意两个元素都可比。(在偏序集中可以看成是DAG上的一条路径上的一些元素,这些元素可能只是这条路径上不连续的一部分;在图论定义的DAG上要求是一条连续路径)

  • 反链:指一个集合SA,它的任意两个元素都不可比。(这个集合里的任何两个元素无法联通)

  • 最小链覆盖:用一些链去覆盖一个DAG,求最少的链数量(一个点也算一条链);分为两种:链可以相交(可以重复经过某个点)或者链不可以相交(不可以重复经过某个点,包括起点终点)

那么有

  • 对于一个偏序集,其最少不可重链覆盖数等于其最大反链的大小。
  • 对于一个偏序集,其最少反链覆盖数等于其最大链的大小。
  • DAG的最小可重链覆盖数等于最大反链;因为可重链覆盖不好求解,所以我们把dag做一个传递闭包(即若原图中ab有边,bc有边,那么新图中ac有边)后转化为不可重复的链,就可以用二分图匹配求解,且此时有最大反链等于最大点独立集。

应用

P3974 [TJOI2015]组合数学

在本题中,将每个格子拆为其财宝个数个元素,我们定义a p b指元素a在网格图中可以到达b。注意,同一格子中的元素是不能互相到达的(一次只能拿一个)

自然地,链就可以表示从左上角到右下角的一条路径,反链则是从右上角到左下角。

dpi,j为以(i,j)为左下角的矩形中的最长反链长(这就是答案),那么

dpi,j=max{dpi1,j,dpi,j+1,dpi1,j+1+ai,j}

前两个是继承关系(矩形的并),后一个是包含(i,j)的最长反链长,因为(i,j)(i1,j1)在一个反链。

代码:

#include <bits/stdc++.h>

using namespace std;

#define ll long long

int t, n, m, a[1005][1005];

ll dp[1005][1005];

int read()
{
	int x = 0, fl = 1; char ch = getchar();
	while (ch < '0' || ch > '9') { if (ch == '-') fl = -1; ch = getchar();}
	while (ch >= '0' && ch <= '9') {x = x * 10ll + ch - '0'; ch = getchar();}
	return x * fl;
}

int main()
{
	t = read();
	while (t -- )
	{
		n = read(), m = read();
		for (int i = 1; i <= n; i ++ )
			for (int j = 1; j <= m; j ++ )
				a[i][j] = read();
		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= n; i ++ )
			for (int j = m; j >= 1; j -- )
				dp[i][j] = max(dp[i - 1][j + 1] + a[i][j], max(dp[i - 1][j], dp[i][j + 1]));
		printf("%lld\n", dp[n][1]);
	}
	return 0;
}
posted @   andysj  阅读(513)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示