看到这道题感觉像是网络流,如果没有权值,可以用DAG最小路径覆盖,有权值,感觉可以求一个上下界最小可行流,但内存卡了....时间估计也悬.

正解要用到一些数学知识,这里梳理一下:

定义:

  偏序关系: 满足自反,反对称,传递的关系是自反关系

  链: 偏序集A的一个子集B,并且满足B中元素两两可比

  反链: 偏序集A的一个子集B,并且满足B中元素两两不可比

  集合的划分: 集合A的划分是很多个集合,这些集合的交集为空,并集为A

Dilworth定理:

  偏序集的最长反链的大小等于最小链划分

另一个定理:

  偏序集的最长链大小等于最小反链划分

第二个定理很好证明,网上有很多,第一个定理大概感受一下吧.

所以这道题其实就求一个偏序集的最小链划分,我们用第一个定理,就是求它的最长反链,这个可以用DP搞定.

总结一下:

  1, 一个集合及其偏序关系与一个DAG相对应, 或者说偏序集的图论本质便是一个DAG.

  2, 求一个偏序关系的最长反链:

    1) 如果该偏序关系的否也是一个类偏序关系,那么直接求后者的最长链长度就行了(比如(a,b)R(c,d) <=> a<=c and b<=d 就是这样一种关系).

    2) 如果该偏序关系没有这样的性质,就用第一个定理把原问题转换成求DAG的最少路径覆盖问题.

 #include <cstdio>
#include <cstring>
#define max(a,b) ((a)>(b)?(a):(b))
#define N 1010 int n, m;
int aa[N][N];
int dp[N][N], up[N][N], rg[N][N]; int main() {
int T;
scanf( "%d", &T );
while( T-- ) {
scanf( "%d%d", &n, &m );
for( int i=; i<=n; i++ )
for( int j=; j<=m; j++ )
scanf( "%d", &aa[i][j] );
memset( up, , sizeof(up) );
memset( rg, , sizeof(rg) );
for( int i=; i<=n; i++ )
for( int j=m; j>=; j-- ) {
dp[i][j] = aa[i][j] + max( up[i-][j+], rg[i-][j+] );
up[i][j] = max( dp[i][j], up[i-][j] );
rg[i][j] = max( dp[i][j], rg[i][j+] );
}
int ans = ;
for( int i=; i<=n; i++ )
ans = max( ans, dp[i][] );
for( int j=; j<=m; j++ )
ans = max( ans, dp[n][j] );
printf( "%d\n", ans );
}
}

bzoj 3997 Dilworth定理的更多相关文章

  1. 1143, 3997: Dilworth定理的简单应用

    偏序集上的最小链覆盖等于最长反链 于是两道题 1143: [CTSC2008]祭祀river 求偏序集上的最长反链 转换成偏序集上的最小链覆盖 求个闭包,转换成最小路径覆盖,二分图匹配一发 #incl ...

  2. BZOJ.4160.[NEERC2009]Exclusive Access 2(状压DP Dilworth定理)

    BZOJ DAG中,根据\(Dilworth\)定理,有 \(最长反链=最小链覆盖\),也有 \(最长链=最小反链划分数-1\)(这个是指最短的最长链?并不是很确定=-=),即把所有点划分成最少的集合 ...

  3. BZOJ.1143.[CTSC2008]祭祀(Dilworth定理 最大流ISAP)

    题目链接 题目是求最长反链,反链指点集内任意两点不能互相到达. 根据Dilworth定理,在DAG中,\[最长反链 = 最小路径覆盖 = V - 最大匹配数\] 用Floyd求一遍传递闭包后,在所有可 ...

  4. 【BZOJ 3997】 3997: [TJOI2015]组合数学 (DP| 最小链覆盖=最大点独立集)

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 919  Solved: 664 Description 给出 ...

  5. 【codevs1044】导弹拦截问题与Dilworth定理

    题目描述 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某 ...

  6. 偏序集的Dilworth定理

    定理1 令(X,≤)是一个有限偏序集,并令r是其最大链的大小.则X可以被划分成r个但不能再少的反链.其对偶定理称为Dilworth定理:定理2 令(X,≤)是一个有限偏序集,并令m是反链的最大的大小. ...

  7. hdu1051(LIS | Dilworth定理)

    这题根据的Dilworth定理,链的最小个数=反链的最大长度 , 然后就是排序LIS了 链-反链-Dilworth定理 hdu1051 #include <iostream> #inclu ...

  8. (转载)偏序集的Dilworth定理学习

    导弹拦截是一个经典问题:求一个序列的最长不上升子序列,以及求能最少划分成几组不上升子序列.第一问是经典动态规划,第二问直接的方法是最小路径覆盖, 但是二分图匹配的复杂度较高,我们可以将其转化成求最长上 ...

  9. codevs1044:dilworth定理

    http://www.cnblogs.com/submarine/archive/2011/08/03/2126423.html dilworth定理的介绍 题目大意:求一个序列的lds 同时找出这个 ...

随机推荐

  1. Strusts2笔记4--类型转换器

    类型转换器: Struts2默认情况下可以将表单中输入的文本数据转换为相应的基本数据类型.这个功能的实现,主要是由于Struts2内置了类型转换器.这些转换器在struts-default.xml中可 ...

  2. 【技巧总结】Penetration Test Engineer[4]-Web-Security(文件处理、会话管理、访问控制、SSRF、反序列化漏洞)

    Web安全基础2 3.8.文件处理 1)文件上传 一个正常的业务需求,问题在于控制上传合法文件. 防御文件上传 客户端javascript校验(通常校验扩展名) 检查MIME类型 检查内容是否合法 随 ...

  3. python 结构化数据解析

    # -*- coding: utf-8 -*- # @Time : 2018/8/31 14:32 # @Author : cxa # @File : glomtest.py # @Software: ...

  4. RabbitMQ学习(一):RabbitMQ要点简介

    转载:http://blog.csdn.net/leixiaotao_java/article/details/78909760#t0 1.什么是RabbitMQ? RabbitMQ是由Erlang语 ...

  5. DevExpress CxGrid 隐藏 Drag a column header to group by that column

  6. C++ 实现memcpy和strcpy

    /** * @Method: Memcpy * @Access: public * @Return: void * * @Param : dst - 目的起始地址 * @Param : src - 源 ...

  7. sqlserver中的全局变量总结

    @@CONNECTIONS返回自上次启动 Microsoft? SQL Server? 以来连接或试图连接的次数.@@CPU_BUSY返回自上次启动 Microsoft? SQL Server? 以来 ...

  8. fedora常见问题和解决方案

    fedora作为linux主流发行版之一,大部分功能还是很赞的.只是在美观性和其他一些细节上还是需要手工调整才有更加体验. 以下解决方案,使用fedora20+gnome3环境 eclipse界面难看 ...

  9. hdu 5122 (2014北京现场赛 K题)

    把一个序列按从小到大排序 要执行多少次操作 只需要从右往左统计,并且不断更新最小值,若当前数为最小值,则将最小值更新为当前数,否则sum+1 Sample Input255 4 3 2 155 1 2 ...

  10. ES6-const注意

    注意要点 const 如何做到变量在声明初始化之后不允许改变的?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动.此时,你可能已经想到,简单类型和复合类型 ...