【BZOJ3997】[TJOI2015]组合数学

Description

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

Input

第一行为正整数T,代表数据组数。

每组数据第一行为正整数N,M代表网格图有N行M列,接下来N行每行M个非负整数,表示此格子中财宝数量,0代表没有

Output

输出一个整数,表示至少要走多少次。

Sample Input

1
3 3
0 1 5
5 0 0
1 0 0

Sample Output

10

HINT

N<=1000,M<=1000.每个格子中财宝数不超过10^6

题解:丧病结论题,拓扑图的最小链覆盖=最长反链。

于是n^2DP求出最长反链就行了。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,m;
int v[1010][1010],f[1010][1010]; inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void work()
{
n=rd(),m=rd();
int i,j;
for(i=1;i<=n;i++) for(j=1;j<=m;j++) v[i][j]=rd();
memset(f,0,sizeof(f));
for(j=m;j>=1;j--)
{
for(i=1;i<=n;i++)
{
f[i][j]=max(max(f[i-1][j],f[i][j+1]),f[i-1][j+1]+v[i][j]);
}
}
printf("%d\n",f[n][1]);
}
int main()
{
int T=rd();
while(T--) work();
return 0;
}

最新文章

  1. BZOJ 1112: [POI2008]砖块Klo
  2. baguetteBox.js响应式画廊插件(纯JS)
  3. 20145315 《Java程序设计》实验五实验报告
  4. 异步刷新tableView
  5. Unable to create the store directory. (Exception from HRESULT: 0x80131468)
  6. int string相互转换
  7. FindWindowEx使用方法
  8. LeetCode OJ 219.Contains Duplicate 2
  9. Vue学习记录第一篇——Vue入门基础
  10. python 实现登录程序
  11. docker cs50 ide 安装
  12. Flume日志采集系统
  13. UWP: 妙用自定义 Action 以简化并重用代码
  14. 20165223 week2学习查漏补缺
  15. 阿里云配置ssl证书服务遇到的几个问题和解决方法
  16. [UE4]InterpToMovement
  17. UIView动画上
  18. win10禁止更新的方法
  19. mysql 导入csv 转义
  20. opencv3.2.0实现视频抽帧,并保存成图片

热门文章

  1. LeetCode OJ-- Length of Last Word
  2. Codeforces 898 C.Phone Numbers-STL(map+set+vector)
  3. Wannafly交流赛1 B 硬币[数学思维/贪心]
  4. 百度前端开发规范 by fex-team
  5. DotnetBrowser入门教程-(1)浏览器控件使用
  6. ubuntu 添加用户
  7. 跨域问题解决方式(HttpClient安全跨域 &amp;amp; jsonp跨域)
  8. 【Python】Python中in与not in
  9. 解析iscroll-小demo
  10. python判断字符串类型