P3335-[ZJOI2013]蚂蚁寻路【dp】
正题
题目链接:https://www.luogu.com.cn/problem/P3335
题目大意
给出\(n\times m\)的网格,每个格子有权值。一个回路在格子的边上,要求有\(2\times k\)次左转,其他都是右转,且最后\(2\)次一定得是右转。
求包含的格子权值和最大。
\(1\leq n,m\leq 100,0\leq k\leq 10\)
解题思路
看起来很像插头\(dp\)对吧,但是因为最后两下得是右转所以不是插头\(dp\)。
画一下不难发现包围出来的图形的底部一定是平的,然后上面是一个凹凸的形状。且会有\(k+1\)个凸,\(k\)个凹。也就是将固定的底部划分成\(2\times k+1\)个凹凸相间的矩形。
先枚举一个底部,然后考虑\(dp\)。设\(f_{j,p,h}\)表示现在到第\(j\)列,第\(p\)个正方形,高度为\(h\)时的最大权值。
转移的时候根据\(p\)的奇偶性决定是在上还是在下,当然也可以直接延长这个矩形。
做个前缀和优化就是\(O(n^2mk)\)的了
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int n,m,k,a[N][N],s[N][N],f[N][30][N],g[N][30][N][2],ans;
int main()
{
scanf("%d%d%d",&n,&m,&k);k=k*2+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
s[i][j]=s[i-1][j]+a[i][j];
}
for(int p=1;p<=k;p++)
for(int h=1;h<=n;h++)
f[0][p][h]=g[0][p][h][0]=g[0][p][h][1]=-1e9;
ans=-1e9;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
for(int p=1;p<=k;p++){
for(int h=1;h<=i;h++)
f[j][p][h]=max(f[j-1][p][h],g[j-1][p-1][h][p&1])+s[i][j]-s[i-h][j];
g[j][p][1][1]=g[j][p][i][0]=-1e9;
for(int h=i-1;h>=1;h--)
g[j][p][h][0]=max(g[j][p][h+1][0],f[j][p][h+1]);
for(int h=2;h<=i;h++)
g[j][p][h][1]=max(g[j][p][h-1][1],f[j][p][h-1]);
}
for(int h=1;h<=i;h++)
ans=max(ans,f[j][k][h]);
}
printf("%d\n",ans);
return 0;
}
P3335-[ZJOI2013]蚂蚁寻路【dp】的更多相关文章
- 洛谷P3335 [ZJOI2013]蚂蚁寻路
题目描述 在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长. 蚂蚁转弯是有一定特点的,即它的转弯序 ...
- bzoj3111: [Zjoi2013]蚂蚁寻路
题目链接 bzoj3111: [Zjoi2013]蚂蚁寻路 题解 发现走出来的图是一向上的凸起锯齿状 对于每个突出的矩形dp一下就好了 代码 /* */ #include<cstdio> ...
- BZOJ 3111: [Zjoi2013]蚂蚁寻路
Sol DP. 首先观察转折,画画图,看看移动路线,可以非常轻易的发现如果走到起点的下方是回不去的.. 然后它就相当于一个底部是平的,顶部凹凹凸凸的形状,每右转两次或左转两次就会形成小矩阵,这样就可以 ...
- 3111: [Zjoi2013]蚂蚁寻路 - BZOJ
题目描述 Description在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长.蚂蚁转弯是有一定 ...
- 【题解】ZJOI2013蚂蚁寻路
这题强呀……打了10+30暴力之后苦想1h并不会做……于是去看题解.看题解的时候又莫名各种看错,结果看了好久才懂……记录一下血泪史吧. 这题不难发现走出来的图形就是一个高低高低的城堡型图案,命名为高峰 ...
- BZOJ 2023 [Usaco2005 Nov]Ant Counting 数蚂蚁:dp【前缀和优化】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2023 题意: 有n个家族,共m只蚂蚁(n <= 1000, m <= 1000 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- NOIP2018 填坑记
Oct,22ed,2018 DAY -18 又是颓废的一天呢 我好菜啊,一个圆方树弄了一整天(点双怎么那么毒瘤).(铁人两项怎么那么多点) Oct,23rd,2018 DAY -17 又双叒叕颓了一天 ...
- POJ3046选蚂蚁创建集合_线性DP
POJ3046选蚂蚁创建集合 一个人的精力是有限的呢,如果一直做一件事迟早会疲惫,所以自己要把握好,不要一直埋头于一件事,否则效率低下还浪费时间 题目大意:一共有T(1,2...n为其种类)种蚂蚁,A ...
随机推荐
- WPF 中的 Command 命令
<Window x:Class="CommandDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx ...
- 异步编程之EAP
一.概述 前面我们了解到了APM编程模式,但APM不支持对异步操作的取消和没有提供对进度报告的功能. 对于界面程序来说,进度报告和取消操作的支持也是必不可少的,为了支持这些功能,微软在.NET 2.0 ...
- Ubuntu16.04 Linux 下无痛安装、配置Gogs
本文在Win7+VMware的ubuntu 16.04中测试,安装Gogs,Install from binary. 准备工作: sudo apt-get install git sudo addus ...
- ES6扩展运算符(三点运算符)...的用法
1. 第一个叫做 展开运算符(spread operator),作用是和字面意思一样,就是把东西展开.可以用在array和object上都行. let a = [1,2,3]; let b = [0, ...
- C#使用异步需要注意的几个问题
C#异步使用需要注意的几个问题1.异步方法如果只是对别的方法的简单的转发调用,没哟复杂的逻辑(比如等待A的结果,再调用B,等待A调用的返回值拿到内部做一些处理再返回),那么就可以去掉async关键字. ...
- Tars | 第3篇 Tars中期汇报测试文档(Java语言实现Subset路由规则)
目录 前言 1. 任务介绍 2. 测试模拟方案 2.0 *前置工作 2.1 添加路由规则 2.2 添加存活节点 2.3 [输出]遍历输出当前存活节点 2.4 [核心]对存活节点按subset规则过滤 ...
- Python - 面向对象编程 - 小实战(1)
题目 设计一个类Person,生成若干实例,在终端输出如下信息 小明,10岁,男,上山去砍柴 小明,10岁,男,开车去东北 小明,10岁,男,最爱大保健 老李,90岁,男,上山去砍柴 老李,90岁,男 ...
- C# Dapper基本三层架构使用 (三、DAL)
数据访问层(DAL),主要是存放对数据类的访问,即对数据库的添加.删除.修改.更新等基本操作 首先需要在UI层App.Config配置文件中增加连接字符串,如下所示 <connectionStr ...
- js 显示日期时间,时间过一秒加1
html: <div id="data"><font>2017年10月17日 15:11:11</font></span> js: ...
- [第一篇]——Docker 教程之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker 教程 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...