博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3997 Dilworth定理
阅读量:5100 次
发布时间:2019-06-13

本文共 1635 字,大约阅读时间需要 5 分钟。

 

看到这道题感觉像是网络流,如果没有权值,可以用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的最少路径覆盖问题.

 

1 #include 
2 #include
3 #define max(a,b) ((a)>(b)?(a):(b)) 4 #define N 1010 5 6 int n, m; 7 int aa[N][N]; 8 int dp[N][N], up[N][N], rg[N][N]; 9 10 int main() {11 int T;12 scanf( "%d", &T );13 while( T-- ) {14 scanf( "%d%d", &n, &m );15 for( int i=1; i<=n; i++ ) 16 for( int j=1; j<=m; j++ ) 17 scanf( "%d", &aa[i][j] );18 memset( up, 0, sizeof(up) );19 memset( rg, 0, sizeof(rg) );20 for( int i=1; i<=n; i++ ) 21 for( int j=m; j>=1; j-- ) {22 dp[i][j] = aa[i][j] + max( up[i-1][j+1], rg[i-1][j+1] );23 up[i][j] = max( dp[i][j], up[i-1][j] );24 rg[i][j] = max( dp[i][j], rg[i][j+1] );25 }26 int ans = 0;27 for( int i=1; i<=n; i++ )28 ans = max( ans, dp[i][1] );29 for( int j=1; j<=m; j++ )30 ans = max( ans, dp[n][j] );31 printf( "%d\n", ans );32 }33 }
View Code

 

转载于:https://www.cnblogs.com/idy002/p/4557042.html

你可能感兴趣的文章
c#FTP应用---windows iis
查看>>
linux下调整java版本
查看>>
AutoCAD实用技巧基础篇
查看>>
Junit测试工具
查看>>
ubuntu 系统环境配置记录
查看>>
C# 流总结
查看>>
org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/input
查看>>
jumpserver安装与部署
查看>>
Apache,php配置
查看>>
Python特殊语法:filter、map、reduce、lambda
查看>>
vs2008 此安装不支持该项目类型
查看>>
C# Hash算法
查看>>
转:C语言深度剖析三
查看>>
Educational Codeforces Round 69 (Rated for Div. 2) A - DIY Wooden Ladder
查看>>
stm32之CMSIS标准、库目录、GPIO
查看>>
Dima and Lisa
查看>>
《算法4》回顾(一)
查看>>
Repeater用ul li,一行显示多条数据
查看>>
Java并发(四):并发集合ConcurrentHashMap的源码分析
查看>>
5. Longest Palindromic Substring
查看>>