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

本文共 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

你可能感兴趣的文章
JavaScript面向对象
查看>>
Intellij修改模板代码
查看>>
2.页面布局示例笔记
查看>>
一些老游戏CPU 100%占用的解决方法
查看>>
f5基本介绍
查看>>
博前语
查看>>
Java SE核心之一:常用类,包装类,其他基本数据类型包装类。
查看>>
郑捷《机器学习算法原理与编程实践》学习笔记(第二章 中文文本分类(一))...
查看>>
python (ploit)
查看>>
Android 用achartengine 画折线图怎么显示不正确
查看>>
程序简单的测试与升级(暨实践第一次作业)
查看>>
信号处理
查看>>
【100题】第五十九题 用C++编写不能被继承的类
查看>>
轻描淡写
查看>>
mysql基本操作
查看>>
39.CSS3弹性伸缩布局【下】
查看>>
[javascript]图解+注释版 Ext.extend()
查看>>
我的前端工具集(七)div背景网格
查看>>
linux 下mongo 基础配置
查看>>
【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)...
查看>>