博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3997 [TJOI2015]组合数学
阅读量:6794 次
发布时间:2019-06-26

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

Description

一个\(n*m\)的网格图,每个格子要求了最少经过次数;每次可以向下/向右走,求至少走多少次可以使每个格子走过的次数不小于它的最小经过次数。\(n, m\leq1000\)

Solution

定理:有向图最小路径覆盖等于最大反链长。“反链”是指一些互不可达的点组成的集合。

那么这个问题中“互不可达”就相当于\(x1<x2, y1>y2\)这样,也就是左上到右下的一条路径。

dp​即可。

Code

#include 
#include
#include
const int N = 1050;int A[N][N], f[N][N];int main() { int T; scanf("%d", &T); while (T--) { memset(f, 0, sizeof f); int n, m; scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) scanf("%d", &A[i][j]); for (int i = 0; i < n; ++i) for (int j = m - 1; ~j; --j) { f[i][j] = std::max(A[i][j], f[i][j + 1]); if (i) { f[i][j] = std::max(f[i][j], f[i - 1][j + 1] + A[i][j]); f[i][j] = std::max(f[i][j], f[i - 1][j]); } } printf("%d\n", f[n - 1][0]); } return 0;}

转载于:https://www.cnblogs.com/y-clever/p/8512460.html

你可能感兴趣的文章
FusionCharts free(图形报表)中文开发指南
查看>>
使用 Screen 创建并管理多个 shell
查看>>
adobe acrobat professional9.0中的PDF/A模式是什么意思
查看>>
【码云周刊第 30 期】打造场景化的图片特效处理工具
查看>>
fedora的官方镜像地址列表
查看>>
about socket
查看>>
我的友情链接
查看>>
本地YUM源配置与简单用法
查看>>
Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果强化版
查看>>
not 与整数
查看>>
学习使用资源文件[3] - 用 Image 显示资源中的图片
查看>>
机器突然重启导致Mantis错误
查看>>
mysql基础(二) 常用SQL语句
查看>>
redhat 6.5 php 升级到5.6
查看>>
oracle数据库清理和回收system和sysaux表空间
查看>>
STL实例
查看>>
CCNP sla,route-map结合应用实现负载均衡和冗余
查看>>
大学生微信卖吃喝月入10万,创业因女友娇气
查看>>
VC非ASCII语言复制到剪切板乱码问题
查看>>
QT+OPENCV摄像头的三种效果显示
查看>>