题目描述

为了提高智商,ZJY开始学习组合数学。某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝。每次从左上角出发,只能往右或下走。问至少要走几次才可能把财宝全捡完。

但是她还不知足,想到了这个问题的一个变形:假设每个格子中有好多块财宝,而每一次经过一个格子至多只能捡走一块财宝,其他条件不变,至少要走几次才可能把财宝全捡完?

这次她不会做了,你能帮帮她吗?

输入输出格式

输入格式:

第一行为一个正整数t,表示数据组数

每组数据的第一行是两个正整数n和m,表示这个网格图有n行m列。

接下来n行,每行m个非负整数,表示这个格子中的财宝数量(0表示没有财宝)。

输出格式:

对于每组数据,输出一个整数,表示至少走的次数。

输入输出样例

输入样例#1:

1
3 3
0 1 5
5 0 0
1 0 0
输出样例#1:

10

说明

数据范围

对于30%的数据,n≤5.m≤5,每个格子中的财宝数不超过5块。

对于50%的数据,n≤100,m≤100,每个格子中的财宝数不超过1000块

对于100%的数据,n≤1000,m≤1000,每个格子中的财宝不超过10^6块

解析:

这是天津市2015年的省选题(天津好像离北京很近~~~)于是乎我就做了这道题。。。

题目的意思就是用最少的链覆盖住整个图,自然而然(看过题解后)就想到了最小链覆盖;

而根据著名的(反正我是没听过)的Dilworth定理,DAG最小链覆盖的条数就等于最大点独立集/最长反链的元素个数;;;

所谓de反链就是去找一些点,其中找两个点,使其直接间接均不可达;而反链中元素最多的就是最长反链了。

所以这个题的本质上是去找这个图的最长反链。

接下来就到了我们有趣的dynamic programming环节辣;;;

由题目可知,只能从左往右,从上往下走,所以这个题的反链一定是由右上到左下的。

而从上面和右面均能形成链,所以直接它直接就可能是这个点的最长反链;

从右上走到左下是不可能的,所以我们要把右上的点加上这个点的值才可能是最长反链;

而我们要求的是最长反链,但这几个部分显然是不能够同时取的,所以要选这三个的最大值

状态转移方程就很容易写出了:

 f[i][j]=max(f[i-][j+]+a[i][j],max(f[i-][j],f[i][j+]));

  这里还要注意的一点就是循环变量,i是从1-〉n递增的,j是从m-〉1递减的,原因很简单,就是要满足最长反链从左下不可能到达右上的性质;

下面上代码:

 #include<iostream>
#include<cstdio>//getchar要引cstdio
using namespace std;
int t,n,m;
long long a[][],f[][];//要开大!洛谷上本题有5个极限数据,不开就会RE得很惨~
int read()//读入优化
{
int f=,x=;
char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
int main()
{
t=read();
for(int s=;s<=t;s++)
{
n=read();
m=read();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
a[i][j]=read();
f[i][j]=;
}
}
//dp
for(int i=;i<=n;i++)
{
for(int j=m;j>=;j--)
{
f[i][j]=max(f[i-][j+]+a[i][j],max(f[i-][j],f[i][j+]));
}
}
cout<<f[n][]<<endl;//千万不要忘记输出回车。。。我爆了5次零。。。
}
}

  

P3974 [TJOI2015]组合数学的更多相关文章

  1. 3997: [TJOI2015]组合数学

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 247  Solved: 174[Submit][Status ...

  2. BZOJ3997: [TJOI2015]组合数学(网络流)

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 405  Solved: 284[Submit][Status ...

  3. BZOJ 3997: [TJOI2015]组合数学 [偏序关系 DP]

    3997: [TJOI2015]组合数学 题意:\(n*m:\ n \le 1000\)网格图,每个格子有权值.每次从左上角出发,只能向下或右走.经过一个格子权值-1.至少从左上角出发几次所有权值为0 ...

  4. 【BZOJ3997】[TJOI2015]组合数学(动态规划)

    [BZOJ3997][TJOI2015]组合数学(动态规划) 题面 BZOJ 洛谷 题解 相当妙的一道题目.不看题解我只会暴力网络流 先考虑要求的是一个什么东西,我们把每个点按照\(a[i][j]\) ...

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

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

  6. 【BZOJ3997】[TJOI2015]组合数学 最长反链

    [BZOJ3997][TJOI2015]组合数学 Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格 ...

  7. [TJOI2015]组合数学

    题目描述 为了提高智商,ZJY开始学习组合数学.某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝.每次从左上角出发,只能往右或下走.问至少要走几次才可能把财宝全捡完. 但是她还不知足,想到 ...

  8. bzoj3997[TJOI2015]组合数学(求最长反链的dp)

    组合数学 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...

  9. 【BZOJ】3997: [TJOI2015]组合数学

    题意 \(N \times M\)的网格,一开始在\((1, 1)\)每次可以向下和向右走,每经过一个有数字的点最多能将数字减1,最终走到\((N, M)\).问至少要走多少次才能将数字全部变为\(0 ...

随机推荐

  1. 线段树 区间开方区间求和 & 区间赋值、加、查询

    本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...

  2. __x__(35)0908第五天__opacity 透明度

    opacity 透明度 设置一个  0 - 1 之间的值. opacity: 0;    完全透明 opacity: 0.5    半透明 opacity: 1;    完全不透明 缺点: IE8及以 ...

  3. Java 初始化、final、清理

    1 为什么需要无参构造器? 第一个是继承需要 super 调用父类的构造器(父类构造器必须存在且不为 private.可以是无参/默认构造器,也可以是有参构造器),特别的如果父类不包含无参构造器的话, ...

  4. jQuery插件开发的五种形态小结(转)

    关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...

  5. Unity进阶----AssetBundle_02(加载依赖关系及网络资源)(2018/10/31)

    网络资源加载: string path ="file://"+ Application.streamingAssetsPath + "\\windows\\123&quo ...

  6. CISCO MDS – Useful ‘Show’ Commands

    CISCO MDS – Useful ‘Show’ Commands CONFIG:show startup-configshow running-configshow running-config ...

  7. 理解es6 中 arrow function的this

    箭头函数相当于定义时候,普通函数.bind(this)箭头函数根本没有自己的this,导致内部的this就是定义时候的外层代码块中的this.外层代码块中的this,则取决于执行时候环境上下文cont ...

  8. js手机浏览器浏览WebApp弹出的键盘遮盖住文本框的解决办法

    if(window.navigator.userAgent.indexOf('Android') > -1 || window.navigator.userAgent.indexOf('Adr' ...

  9. JMeter压测基础(三)——Mysql数据库

    JMeter压测基础(三)——Mysql数据库 环境准备 mysql驱动 JMeter jdbc配置 JMeter jdbc请求 1.下载mysql驱动:mysql-connector-java.ja ...

  10. 学习懈怠的时候,可以运行Qt自带的Demo,或者Delphi控件自带的Demo,或者Cantu书带的源码,运行一下Boost的例子(搞C++不学习Boost/Poco/Folly绝对是一大损失,有需要使用库要第一时间想到)(在六大的痛苦经历说明,我的理论性确实不强,更适合做实践)

    这样学还不用动脑子,而且熟悉控件也需要时间,而且慢慢就找到感觉了,就可以精神抖擞的恢复斗志干活了.或者Cantu书带的源码. 并且可以使用Mac SSD运行Qt的Demo,这样运行速度快一点. 此外, ...