3111: [Zjoi2013]蚂蚁寻路 - BZOJ
题目描述 Description
在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点
处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯
前走了多长。蚂蚁转弯是有一定特点的,即它的转弯序列一定是如下的形式:
右转,右转,左转,左转,右转,右转…左转,左转,右转,右转,右转。
即两次右转和两次左转交替出现的形式,最后两次右转(最后两次一定是
右转)后再多加一次右转。我们还知道,蚂蚁不会在同一个位置连续旋转两次,
并且蚂蚁行走的路径除了起点以外,不会到达同一个点多次,它最后一定是回
到起点然后结束自己的行程,而且蚂蚁只会在棋盘格子的顶点处转弯。
设 k为蚂蚁左转的次数除以2,当k=0 时,蚂蚁可能行走的路径如下图
转弯序列为:右转,右转,右转。
当 k=1 时,蚂蚁可能行走的路径如下图
转弯序列为:右转,右转,左转,左转,右转,右转,右转。
现在已知棋盘大小、每个格子的权值以及左转次数/2 的值,问蚂蚁走出
的路径围出的封闭图形,权值之和最大可能是多少。
输入描述 Input Description
在输入文件ant.in 中,第一行三个数n,m,k。意义如题目描述。
接下来一个n 行m 列的整数矩阵,表示棋盘。
输出描述 Output Description
一个数,表示蚂蚁所走路径围出的图形可能的最大权
值和。
样例输入 Sample Input
2 5 2
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
样例输出 Sample Output
-8
数据范围及提示 Data Size & Hint
【样例说明】
除了第一行的第二个和第一行的第四个都要围起来才至少合法。
【数据规模与约定】
10%的数据所有格子中权值均非负
另20%的数据n=2
另30%的数据k=0
100%的数据1≤n≤100,1≤m≤100,0≤k≤10 保证存在合法路径,数据有梯度,格子中每个元素的值绝对值不超过 10000
把题目意思稍微变一下,就是然你选出一个像长城一样的图形,包含的权值最大
我们很容易想到五维动归f[i1,j1,i2,j2,k](i1,j1,i2,j2表示第k个矩形的4个坐标值)(这个k是原来的2*k+1,转换了)
但是五维时间空间上都无法承受
通过五维动归转移的时候我们发现转移的限制条件只有4个,分别是k,这个矩形右下角的横坐标和纵坐标,这个矩形的高度
所以空间成功压到四维f[i,j,k,h]
但是按照原来的转移枚举右上角,其实时间还是五维
再仔细想想,我们必须枚举右上角吗
一个矩形其实是可以拆成一个个的长条的
对了,所以动归方程就出来了,还要一个辅助数组f2[i,j-1,k,h]记录可以转移到f[i,j,k,h]的值
f[i,j,k,h]:=max{f[i,j-1,k,h],f2[i,j-1,k,h]}+sum;
最后注意一下初值的设定
其实这个是刚好卡空间过了,可以把f[i,j,k,h]的i去掉循环用数组
var
f:array[..,..,..]of longint;
f2:array[..,..,..]of longint;
sum:array[..,..]of longint;
n,m,k,ans:longint; procedure init;
var
i,j,l,h:longint;
begin
read(n,m,k);
k:=*k+;
for i:= to n do
for j:= to m do
begin
read(sum[i,j]);
inc(sum[i,j],sum[i-,j]);
end;
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure work;
var
i,j,l,h:longint;
begin
ans:=-maxlongint;
for i:= to n do
begin
fillchar(f,sizeof(f),<<);
fillchar(f2,sizeof(f2),<<);
for j:= to m do
for h:= to i do
f[j,,h]:=sum[i,j]-sum[h-,j];
for j:= to m do
for l:= to k do
if l and = then
begin
for h:= to i do
f[j,l,h]:=max(max(f[j-,l,h],f2[j-,l-,h+])+sum[i,j]-sum[h-,j],f[j,l,h]);
for h:= to i do
f2[j,l,h]:=max(f[j,l,h],f2[j,l,h-]);
end
else
begin
for h:= to i do
f[j,l,h]:=max(max(f[j-,l,h],f2[j-,l-,h-])+sum[i,j]-sum[h-,j],f[j,l,h]);
for h:=i downto do
f2[j,l,h]:=max(f[j,l,h],f2[j,l,h+]);
end;
for j:= to m do
for h:= to i do
ans:=max(ans,f[j,k,h]);
end;
write(ans);
end; begin
init;
work;
end.
3111: [Zjoi2013]蚂蚁寻路 - BZOJ的更多相关文章
- BZOJ 3111: [Zjoi2013]蚂蚁寻路
Sol DP. 首先观察转折,画画图,看看移动路线,可以非常轻易的发现如果走到起点的下方是回不去的.. 然后它就相当于一个底部是平的,顶部凹凹凸凸的形状,每右转两次或左转两次就会形成小矩阵,这样就可以 ...
- bzoj3111: [Zjoi2013]蚂蚁寻路
题目链接 bzoj3111: [Zjoi2013]蚂蚁寻路 题解 发现走出来的图是一向上的凸起锯齿状 对于每个突出的矩形dp一下就好了 代码 /* */ #include<cstdio> ...
- 洛谷P3335 [ZJOI2013]蚂蚁寻路
题目描述 在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长. 蚂蚁转弯是有一定特点的,即它的转弯序 ...
- 【题解】ZJOI2013蚂蚁寻路
这题强呀……打了10+30暴力之后苦想1h并不会做……于是去看题解.看题解的时候又莫名各种看错,结果看了好久才懂……记录一下血泪史吧. 这题不难发现走出来的图形就是一个高低高低的城堡型图案,命名为高峰 ...
- P3335-[ZJOI2013]蚂蚁寻路【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3335 题目大意 给出\(n\times m\)的网格,每个格子有权值.一个回路在格子的边上,要求有\(2\tim ...
- 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 又双叒叕颓了一天 ...
- 基于仿生算法的智能系统I
仿生算法仿生算法是什么? 什么是仿生? 蜜蜂会造房子,人类就学习蜜蜂盖房子的方法,之后便有了航空建造工程的蜂窝结构. 仿生是模仿生物系统的功能和行为,来建造技术系统的一种科学方法.生活仿生作品现代的飞 ...
- bzoj 3111 蚂蚁 动态规划
题目描述 在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长. 蚂蚁转弯是有一定特点的,即它的转弯序 ...
随机推荐
- Jersey(1.19.1) - Client API, Uniform Interface Constraint
The Jersey client API is a high-level Java based API for interoperating with RESTful Web services. I ...
- JAVA 基础加强学习笔记
一.面向对象 (一)继承 1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函 ...
- 移动Web单行文字垂直居中的问题
单行文字垂直居中的方式你可能可以脱口而出,height和line-height设置为同样就行了,或者设置相同的padding-top和padding-bottom值. 上图是Chrome浏览器下的效果 ...
- 前端性能优化工具--DOM Monster
当我们开发web应用的时候,性能是一个永远不能回避的问题.其实对于DOM的性能调试也是一个不可或缺的过程.使用DOM monster你只需要添加到你的”书签中“,在任何需要调试的页面点击这个书签,它就 ...
- c#基础笔记-----------集合
首先所谓集合是用于管理对象的容器类.一方面集合将独立的对象汇集成群集,作为一个群集来管理,以便进行整体性操作:而另一方面,集合可以方便地获取群集中的个体,进行个体化操作.在.Net中,集合被封装为对象 ...
- 算法 fill
fill(vec.begin(), vec.end(),); //reset all elements to fill(vec.begin(),vec.begin + vec.size/, );//s ...
- 仿360手机卫士界面效果android版源码
仿360手机卫士界面效果android版,这个今天一大早在源码天堂的那个网站上看到了一个那个网站最新更新的一个源码,所以就分享给大学习一下吧,布局还挺不错的,而且也很简单的,我就不把我修改的那个分享出 ...
- cxgrid GridMode 等于 True 时的一些问题。
When using grid mode, the data controller loads a fixed number of dataset records into memory. The n ...
- Kakfa揭秘 Day9 KafkaReceiver源码解析
Kakfa揭秘 Day9 KafkaReceiver源码解析 上一节课中,谈了Direct的方式来访问kafka的Broker,今天主要来谈一下,另一种方式,也就是KafkaReceiver. 初始化 ...
- [Git]代码管理工具简单使用
1 Git简介 Git是分布式的版本控制系统,是Linux内核开发者林纳斯·托瓦兹(Linus Torvalds)为更好地管理Linux内核开发而设计.与CVS.Subversion一类的集中式版本控 ...