BZOJ 3997 TJOI2015 组合数学 Dilworth定理

题目大意:给定一个网格图,每次从左上角出发,只能往右或往下走,最后到达右下角,每个格子有最低经过次数,问最少走几次

Dilworth定理:DAG的最小链覆盖=最大点独立集

最小链覆盖指选出最少的链(可以重复)使得每个点都在至少一条链中

最大点独立集指最大的集合使集合中任意两点不可达

此题中最大点独立集显然是一个集合满足集合中任意两点都是左下-右上的关系

DP一遍就能出解 复杂度O(Tmn)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1010
using namespace std;
int m,n;
long long ans;
int a[M][M];
long long f[M][M];
int main()
{
    int T,i,j;
    for(cin>>T;T;T--)
    {
        cin>>m>>n;ans=0;
        for(i=1;i<=m;i++)
            for(j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        memset(f,0,sizeof f);
        for(j=1;j<=n;j++)
        {
            for(i=m;i;i--)
                f[i][j]=max(f[i][j-1],f[i+1][j-1]+a[i][j]);
            for(i=m;i;i--)
                f[i][j]=max(f[i][j],f[i+1][j]);
            ans=max(ans,f[1][j]);
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-10-08 22:36:49

BZOJ 3997 TJOI2015 组合数学 Dilworth定理的相关文章

bzoj 3997: [TJOI2015]组合数学

3997: [TJOI2015]组合数学 Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. Input 第一行为正整数T,代表数据组数. 每组数据第一行为正整数N,M代表网格图有N行M列,接下来N行每行M个非负整数,表示此格子中财宝数量,0代表没有 Output 输出一个整数,表示至少要走多少次. Samp

BZOJ 3997 [TJOI2015]组合数学(单调DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题目大意] 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走. 问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝, 而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. [题解] 最小链覆盖=最长反链,反链的意思就是该集合中的点相互之间不互达, 在该题中,最长反链可以用dp得出. [代码] #include <c

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

3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 919  Solved: 664 Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. Input 第一行为正整数T,代表数据组数. 每组数据第一行为正整数N,M代表网格图有

[BZOJ 3997] [TJOI 2015] 组合数学

3997: [TJOI2015]组合数学 Time Limit: 20 SecMemory Limit: 128 MB Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. Input 第一行为正整数T,代表数据组数. 每组数据第一行为正整数N,M代表网格图有N行M列,接下来N行每行M个非负整数,表示此格子中财

bzoj3997 [TJOI2015]组合数学

3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MB Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. Input 第一行为正整数T,代表数据组数. 每组数据第一行为正整数N,M代表网格图有N行M列,接下来N行每行M个非负整数,表示此格子

bzoj 3997 Dilworth定理

看到这道题感觉像是网络流,如果没有权值,可以用DAG最小路径覆盖,有权值,感觉可以求一个上下界最小可行流,但内存卡了....时间估计也悬. 正解要用到一些数学知识,这里梳理一下: 定义: 偏序关系: 满足自反,反对称,传递的关系是自反关系 链: 偏序集A的一个子集B,并且满足B中元素两两可比 反链: 偏序集A的一个子集B,并且满足B中元素两两不可比 集合的划分: 集合A的划分是很多个集合,这些集合的交集为空,并集为A Dilworth定理: 偏序集的最长反链的大小等于最小链划分 另一个定理: 偏

[BZOJ 3997] 组合数学

题意 给定 $n \times m$ 的网格图, 每个格子有 $w$ 个财宝. 每次从左上角出发到右下角, 将途中经过的所有格子中的财宝至多拿一个. 问最少多少次能拿完所有财宝. $n, m \le 1000$ . 分析 根据 Dilworth 定理, 最少链划分 = 最大反链长度. 从左下角到右上角进行 DP . 实现 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include &l

P3974 [TJOI2015]组合数学

P3974 [TJOI2015]组合数学 题目描述 为了提高智商,ZJY开始学习组合数学.某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝.每次从左上角出发,只能往右或下走.问至少要走几次才可能把财宝全捡完. 但是她还不知足,想到了这个问题的一个变形:假设每个格子中有好多块财宝,而每一次经过一个格子至多只能捡走一块财宝,其他条件不变,至少要走几次才可能把财宝全捡完? 这次她不会做了,你能帮帮她吗? 输入输出格式 输入格式: 第一行为一个正整数t,表示数据组数 每组数据的第一行是两个正

dilworth定理的通俗讲解

度娘定义:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度.其名称取自数学家Robert P. Dilworth. 反链是一种偏序集,其任意两个元素不可比:而链则是一种任意两个元素可比的偏序集.Dilworth定理说明,存在一个反链A与一个将序列划分为链族P的划分,使得划分中链的数量等于集合A的基数.当存在这种情况时,对任何至多能包含来自P中每一个成员一个元素的反链,A一定是此序列中的最大反链.同样地,对于任何最少包含A中的每一个元素的一