题目描述
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. bzoj3771

    http://www.lydsy.com/JudgeOnline/problem.php?id=3771 生成函数... 其实就是多项式乘法...lrj书上有一个通俗的解释... 然后就是这个样子,我 ...

  2. PCB 规则引擎之编辑器(语法着色,错误提示,代码格式化)

    对于一个规则引擎中的脚本代码编辑器是非常关键的,因为UI控件直接使用对象是规则维护者,关系到用户体验,在选用脚本编辑器的功能时除了满足代码的编辑的基本编辑要求外,功能还需要包含;语法着色,错误提示,代 ...

  3. 绝对牛x的代码注释

    备注:文中字符均可以直接复制直接用! 再补上一个好玩的网站 Ascii World:(链接:http://www.asciiworld.com/). 网站上的图形很多,感兴趣的可以复制链接到浏览器上打 ...

  4. NS2学习笔记(一)

    NS2有两种运行方式: 1.“脚本方式”,输入命令: ns tclscripl.tcl,其中 tclscripl.tcl 是一个Tcl脚本的文件名: 2“命令行方式”,输入命令:ns,进入NS2的命令 ...

  5. BZOJ 2506 分块

    //By SiriusRen #include <bits/stdc++.h> using namespace std; ; ][],g[N],tmp=; struct Node{int ...

  6. Spring思维课程导图——bean得实例化和bean的管理

  7. Coursera公开课-Machine_learing:编程作业3

    第四周 编程作业: Multi-class Classification and Neural Networks 这周作业与上一周有许多相同的部分,比如longistic regression中的lr ...

  8. Android基础TOP3_1:纵横屏切换

    在Res下建立layout-port文件夹  为竖屏时加载的界面: 建立layout-land 文件夹 为横屏加载的界面

  9. python中struct.pack()函数和struct.unpack()函数

    python中的struct主要是用来处理C结构数据的,读入时先转换为Python的字符串类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~.一般输入的渠道来源于文件或者网络的二 ...

  10. css 众妙之门 学习笔记

    伪类: 结构伪类: :empty :only-child :before :after :active :hover :focus :link :visited :first-child :last- ...