这题强呀……打了10+30暴力之后苦想1h并不会做……于是去看题解。看题解的时候又莫名各种看错,结果看了好久才懂……记录一下血泪史吧。

  这题不难发现走出来的图形就是一个高低高低的城堡型图案,命名为高峰跟低谷的话就是一共有k个低谷和k + 1个高峰,且交替出现。发现其实这个图形是由2 * k + 1个矩形所构成的,我们考虑将这样许多矩形看做转移的方向:f[i][j][p][h]代表以点(i, j)为左下角,当前枚举到的是第p个矩形,且高度为(i - h + 1)所能获得的最大权值。

  转移方程:

    \(f[i][j][p][h] = \left \{ f[i][j - 1][p][h], f[i][j - 1][p][h']] \right \} + s[j][i] - s[j][h - 1]; \)

  其中第一部分代表和j - 1处于同一个矩形当中,第二部分则表示根据p的奇偶性选择<h或>h的转移。第二部分如果枚举,则复杂度太高了难以承受,所以用另一个数组g来保存,追加一维0/1来表示是>还是<中的最大值。然后发现其实 i 这一维是没有参与转移的,所以将这一维去掉,节约空间。期间有一个让我比较纠结的地方,就是

    \( ans = max(f[i][j][k][i], g[i][j][k][i][0]); \)

  起初并没有很理解为什么要将前一部分考虑进来。当高度等于i,不是说明这是一个低谷吗?为什么会符合条件呢?但其实有一种情况下是可以的:当没有低谷的时候,这样是一个符合条件的解。追加辅助数组的dp做的太少了,要多多加油呀ヾ(๑╹◡╹)ノ"

#include <bits/stdc++.h>
using namespace std;
#define INF 999999999
#define maxn 105
int n, m, k, ans = -INF, sum[maxn][maxn];
int f[maxn][maxn][maxn], g[maxn][maxn][maxn][]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void work()
{
for(int p = ; p <= k; p ++)
for(int h = ; h <= n; h ++)
{
f[][p][h] = -INF;
g[][p][h][] = g[][p][h][] = -INF;
} for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
{
for(int p = ; p <= k; p ++)
{
for(int h = ; h <= i; h ++)
{
f[j][p][h] = max(f[j - ][p][h], g[j - ][p - ][h][p % ]);
f[j][p][h] += sum[j][i] - sum[j][h - ];
}
g[j][p][][] = -INF;
for(int h = ; h <= i; h ++)
g[j][p][h][] = max(g[j][p][h - ][], f[j][p][h - ]);
g[j][p][i][] = -INF;
for(int h = i - ; h >= ; h --)
g[j][p][h][] = max(g[j][p][h + ][], f[j][p][h + ]);
}
ans = max(ans, max(f[j][k][i], g[j][k][i][]));
}
} int main()
{
n = read(), m = read(), k = read();
k = k * + ;
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
{
int t = read();
sum[j][i] += sum[j][i - ] + t;
}
work();
printf("%d\n", ans);
return ;
}

【题解】ZJOI2013蚂蚁寻路的更多相关文章

  1. bzoj3111: [Zjoi2013]蚂蚁寻路

    题目链接 bzoj3111: [Zjoi2013]蚂蚁寻路 题解 发现走出来的图是一向上的凸起锯齿状 对于每个突出的矩形dp一下就好了 代码 /* */ #include<cstdio> ...

  2. 洛谷P3335 [ZJOI2013]蚂蚁寻路

    题目描述 在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长. 蚂蚁转弯是有一定特点的,即它的转弯序 ...

  3. 3111: [Zjoi2013]蚂蚁寻路 - BZOJ

    题目描述 Description在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长.蚂蚁转弯是有一定 ...

  4. BZOJ 3111: [Zjoi2013]蚂蚁寻路

    Sol DP. 首先观察转折,画画图,看看移动路线,可以非常轻易的发现如果走到起点的下方是回不去的.. 然后它就相当于一个底部是平的,顶部凹凹凸凸的形状,每右转两次或左转两次就会形成小矩阵,这样就可以 ...

  5. P3335-[ZJOI2013]蚂蚁寻路【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3335 题目大意 给出\(n\times m\)的网格,每个格子有权值.一个回路在格子的边上,要求有\(2\tim ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. NOIP2018 填坑记

    Oct,22ed,2018 DAY -18 又是颓废的一天呢 我好菜啊,一个圆方树弄了一整天(点双怎么那么毒瘤).(铁人两项怎么那么多点) Oct,23rd,2018 DAY -17 又双叒叕颓了一天 ...

  8. 【bzoj1085】[SCOI2005]骑士精神

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1757  Solved: 961[Submit][Statu ...

  9. Codeforces Round #188 (Div. 1) B. Ants 暴力

    B. Ants Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/317/problem/B Des ...

随机推荐

  1. android 按钮动态点击

    关键代码: 1.创建一个btn_selector.xml的文件 <?xml version="1.0" encoding="utf-8"?>< ...

  2. doT.js使用介绍

    doT.js特点是快,小,无依赖其他插件,压缩版仅有4K大小. doT.js详细使用介绍 使用方法: 1 2 3 4 5 6 7 {{ }} 模板   开始标记  结束标记 {{= }} 赋值 {{~ ...

  3. 齐博cms最新SQL注入网站漏洞 可远程执行代码提权

    齐博cms整站系统,是目前建站系统用的较多的一款CMS系统,开源,免费,第三方扩展化,界面可视化的操作,使用简单,便于新手使用和第二次开发,受到许多站长们的喜欢.开发架构使用的是php语言以及mysq ...

  4. 对bluebird的理解

    前言 Promise:把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数. 在公众号的开发里面用的const Promise = require('bluebird');con ...

  5. linux io 学习笔记(02)---条件变量,管道,信号

    条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒.条件变量类似异步通信,操作的核心:睡眠.唤醒. 1.pthread_cond_t  定 ...

  6. jsp中的input

    Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1,type=text 输入类型是text,这是我们见的 ...

  7. facebook hash key

    private void printHashKey() { try { PackageInfo info = getPackageManager().getPackageInfo( "xxx ...

  8. 「题目代码」P1007~P1012(Java)

    1007 C基础-计负均正 import java.util.*; import java.io.*; public class Main { public static void main(Stri ...

  9. Selenium LoadableComponent加载组件

    继承LoadableComponent类可以在打开地址时, 判断浏览器是否打开了预期的网址, 需要重写load()与isLoad()方法: 即使没有定义get()方法, 也可以进行get()方法的调用 ...

  10. 生产者与消费者-N:1-基于list

    多个生产者/一个消费者: /** * 生产者 */ public class P { private MyStack stack; public P(MyStack stack) { this.sta ...