题目描述
LYK进了一家古董店,它很想买其中的一幅画。但它带的钱不够买这幅画。
幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它。
老板有一个n*m的矩阵,他想找一个和最大的子矩阵,这个子矩阵可以由四个参数x,y,x2,y2(1<=x<=x2<=n,1<=y<=y2<=m)来表示,表示一个左上角为(x,y),右下角为(x2,y2)的矩阵。
为了让游戏更加有趣,老板给了一个常数P,他想将原来这个矩阵中恰好一个数变为P,使得这个矩阵的最大的子矩阵尽可能大。
老板想知道这个最大值是多少。
你能帮帮LYK吗?

输入格式(puzzle.in)
第一行三个数n,m,P。
接下来n行,每行m个数ai,j描述整个矩阵。

输出格式(puzzle.out)
输出一个数表示答案。

输入样例
3 3 3
-100 3 3
3 -4 3
3 3 3

输出样例
20

样例解释
改变左上角那个数。

数据范围
对于20%的数据n,m<=10。
对于40%的数据n,m<=25。
对于60%的数据n,m<=50。
对于80%的数据n,m<=100。
对于100%的数据1<=n,m<=300,|P|,|ai,j|<=1000。

分析:先考虑最最基本的一个问题:给你一个序列,让你选一个子序列使得和最大.这道题可以很容易地用dp来解决,设f[i]表示前i个中的最大值,f[i] = max{f[i - 1] + a[i],a[i]}.推广到二维要怎么做呢?我们可以固定当前矩阵的上边界l和下边界r,压缩成一维,a[i] = sum[r] - sum[l - 1],然后进行dp就可以了.如果我们要让一个数变成P要怎么做呢?

当前状态转移不下去了,常用的办法是加一维,f[i][0]表示到前i列没有修改元素的最大和,f[i][1]类同,转移也很显然,如果当前的状态是f[i][0],那么之前肯定也没有修改,所以f[i][0] = max{f[i-1][0] + sum[i],sum[i]},如果当前的状态是f[i][1],那么如果之前修改过了,第i列肯定是不能改了,否则就必须改,所以f[i][1] = max{f[i-1][1] + sum[i],sum[i] - minn + p,f[i-1][0] + sum[i] - minn + p},minn为第i列最小的一个数,因为我们要改肯定是改最小的一个数嘛.固定好上下边界递推一下就可以了.

不过注意到必须要修改一个元素的限制,如果上下边界正好包含了整个矩形,那么答案只有可能从f[m][1]得到,其它情况下就可以从f[k][0/1]得到,因为我们可以在选取的子矩形里面改,也可以在外面改.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int inf = 0x7ffffff; int n, m, p, a[][], minn[], b[][], d[], f[][], ans = -inf; int main()
{
scanf("%d%d%d", &n, &m, &p);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
scanf("%d", &a[i][j]);
b[i][j] = a[i][j];
a[i][j] += a[i - ][j];
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= m; j++)
minn[j] = b[i][j];
for (int j = i; j <= n; j++)
{
for (int k = ; k <= m; k++)
{
minn[k] = min(minn[k], b[j][k]);
d[k] = a[j][k] - a[i - ][k];
}
for (int k = ; k <= m; k++)
{
f[k][] = max(f[k - ][] + d[k], d[k]);
f[k][] = max(max(f[k - ][] + d[k], d[k] - minn[k] + p), f[k - ][] + d[k] - minn[k] + p);
}
if (i == && j == n)
ans = max(ans, f[m][]);
else
for (int k = ; k <= m; k++)
ans = max(ans, max(f[k][],f[k][]));
}
}
printf("%d\n", ans); return ;
}

noip模拟赛 解谜游戏的更多相关文章

  1. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  2. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  3. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

  4. CH Round #48 - Streaming #3 (NOIP模拟赛Day1)

    A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...

  5. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...

  6. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  7. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  8. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  9. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

随机推荐

  1. bzoj 2333 [SCOI2011]棘手的操作 —— 可并堆

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2333 稍微复杂,参考了博客:http://hzwer.com/5780.html 用 set ...

  2. Linux命令补充及基础优化。

    1.用户部分 1.1 创建新用户 涉及命令 useradd [root@oldboyedu-50 ~]# useradd oldboy #添加用户 oldboy 1.2 设置密码 [root@oldb ...

  3. Linux系统的整体目录结构和文件解析

    Linux系统目录结构 使用 ls / 查看系统的文件目录: /:根目录,根目录下一般只存放子目录,不存放文件.在linux系统中所有的文件都挂载该目录下. /bin:命令目录. 存放系统的可执行的二 ...

  4. MFC学习篇(一):用OpenCV显示视频

    首先是一些基础的步骤,如建立MFC应用,添加按钮等,博主主要参考了下面这篇文章,其中的前32步都是用OpenCV显示图片和视频所必须的,即通用的.由于LZ原来有配置OpenCV的基础,所以配制还是比较 ...

  5. 【知识总结】多项式全家桶(一)(NTT、加减乘除和求逆)

    我这种数学一窍不通的菜鸡终于开始学多项式全家桶了-- 必须要会的前置技能:FFT(不会?戳我:[知识总结]快速傅里叶变换(FFT)) 以下无特殊说明的情况下,多项式的长度指多项式最高次项的次数加\(1 ...

  6. 关于static函数在类中的定义和使用

    刷题的时候遇到了这样一个问题:平时经常使用 sort()函数, 对结构体进行排序, 但是在类中使用时会出现 这样的错误提示:“Solution::cmp”: 函数调用缺少参数列表:请使用“&S ...

  7. Excel工作常用(一)-生成序列与删除空行

    整理一些工作中,本人经常用到的一些Excel操作 1.自动生成序列 [注]选择 第一格 和 第二格 之后,在右下角出现十字的时候,在往下拉 2.删除空行 方式一,先找出所有空行,在删 [缺点]数据多的 ...

  8. aop 切面demo

    /** * 必须要@Aspect 和 @Component一起使用否则没法拦截通知 * 搞了好久才明白刚刚开始以为时execution里面的配置的问题 * AOP使用很简单的 */@Aspect@Co ...

  9. photoshop制作古风画

    效果图: 素材结构: 前期准备: 素材准备,我的素材包括:印章.花束.二次元妹纸,背景图片. 软件准备,用的软件是 photoshop CS6. 把二次元妹纸拖入photoshop,把她抠出来,Ctr ...

  10. html5——边框

    精确控制 /*水平半径 垂直半径;*/ border-top-left-radius: 30px 40px; border-top-right-radius: 30px 40px; border-bo ...