题目链接  2017 Beijing Problem H

题意  给定一个$n * m$的矩阵,现在可以把矩阵中的任意一个数换成$p$,求替换之后最大子矩阵的最小值。

首先想一想暴力的方法,枚举矩阵中的数,然后$O(n^{3})$求最大子矩阵更新答案,这样复杂度是$O(n^{5})$的。

思考得再仔细一些,就是包含这个数的最大子矩阵和,以及不包含这个数的最大子矩阵的和的较大值。

设原矩阵中最大子矩阵和为$mx$。

设$u_{i}$为只考虑矩阵前$i$行的最大子矩阵和,$d_{i}$为考虑矩阵第$i$行到第$n$行的最大子矩阵和,

$l_{i}$为只考虑矩阵前$i$列的最大子矩阵和,$r_{i}$为考虑矩阵第$i$列到第$m$列的最大子矩阵和。

那么枚举某个格子的时候不经过这个格子的最大子矩阵和为$max(u_{i-1}, d_{i+1}, l_{j-1}, r_{j+1})$

枚举的时候,当$a_{i,j} <= p$时,显然不起作用,跳过。

当$a_{i,j} > p$时,分类讨论:

(1)当$a_{i,j}$被原矩阵的最大子矩阵包含的时候,此时最大子矩阵和被更新为$mx - a_{i,j} + p$

(2)当$a_{i,j}$不被原矩阵的最大子矩阵包含的时候,

此时$mx - a_{i,j} + p < mx = max(u_{i-1}, d_{i+1}, l_{j-1}, r_{j+1})$,对答案不产生影响,

所以直接枚举$a_{i,j}$,更新答案即可。

时间复杂度$O(n^{3})$

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const int N = 153; int n, m, p;
int a[N][N], s[N][N], t[N][N];
int l[N], r[N], u[N], d[N], c[N];
int ans, now; int main(){ while (~scanf("%d%d%d", &n, &m, &p)){
rep(i, 1, n){
rep(j, 1, m) scanf("%d", a[i] + j);
} memset(s, 0, sizeof s); rep(i, 1, n){
s[i][0] = 0;
rep(j, 1, m) s[i][j] = s[i][j - 1] + a[i][j];
} memset(t, 0, sizeof t); rep(j, 1, m){
t[j][0] = 0;
rep(i, 1, n) t[j][i] = t[j][i - 1] + a[i][j];
} rep(i, 0, max(n, m) + 3){
u[i] = -2e9;
d[i] = -2e9;
l[i] = -2e9;
r[i] = -2e9;
} rep(i, 1, m){
rep(j, i, m){
memset(c, 0, sizeof c);
rep(k, 1, n){
c[k] = max(c[k - 1] + s[k][j] - s[k][i - 1], s[k][j] - s[k][i - 1]);
} rep(k, 1, n) u[k] = max(u[k], c[k]);
}
} rep(i, 1, m){
rep(j, i, m){
memset(c, 0, sizeof c);
dec(k, n, 1){
c[k] = max(c[k + 1] + s[k][j] - s[k][i - 1], s[k][j] - s[k][i - 1]);
} rep(k, 1, n) d[k] = max(d[k], c[k]);
}
} rep(i, 1, n){
rep(j, i, n){
memset(c, 0, sizeof c);
rep(k, 1, m){
c[k] = max(c[k - 1] + t[k][j] - t[k][i - 1], t[k][j] - t[k][i - 1]);
} rep(k, 1, m) l[k] = max(l[k], c[k]);
}
} rep(i, 1, n){
rep(j, i, n){
memset(c, 0, sizeof c);
dec(k, m, 1){
c[k] = max(c[k + 1] + t[k][j] - t[k][i - 1], t[k][j] - t[k][i - 1]);
} rep(k, 1, m) r[k] = max(r[k], c[k]);
}
} rep(i, 1, n){
u[i] = max(u[i], u[i - 1]);
} dec(i, n, 1){
d[i] = max(d[i], d[i + 1]);
} rep(i, 1, m){
l[i] = max(l[i], l[i - 1]);
} dec(i, m, 1){
r[i] = max(r[i], r[i + 1]);
} ans = 2e9;
rep(i, 1, n){
rep(j, 1, m){
now = -2e9;
now = max(now, l[j - 1]);
now = max(now, r[j + 1]);
now = max(now, u[i - 1]);
now = max(now, d[i + 1]);
now = max(now, u[n] - a[i][j] + p);
ans = min(ans, now);
}
} ans = min(ans, u[n]);
printf("%d\n", ans);
} return 0;
}

Hihocoder 1634 Puzzle Game(2017 ACM-ICPC 北京区域赛 H题,枚举 + 最大子矩阵变形)的更多相关文章

  1. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  2. 2017 ACM/ICPC(北京)总结

    这个季节的,北京真的很冷. 下午的热身赛,我依然先去敲一道搜索题,但是很不幸这道搜索题坑点还是蛮多的,浪费了好长时间后依然没能A掉,期间Codeblocks崩溃一次使得代码完全丢失,在队友的建议下便暂 ...

  3. HihoCoder 1629 Graph (2017 ACM-ICPC 北京区域赛 C题,回滚莫队 + 启发式合并 + 可撤销并查集)

    题目链接  2017 ACM-ICPC Beijing Regional Contest Problem C 题意  给定一个$n$个点$m$条边的无向图.现在有$q$个询问,每次询问格式为$[l, ...

  4. hihoCoder #1871 : Heshen's Account Book-字符串暴力模拟 自闭(getline()函数) (ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction B) 2018 ICPC 北京区域赛现场赛B

    P2 : Heshen's Account Book Time Limit:1000ms Case Time Limit:1000ms Memory Limit:512MB Description H ...

  5. hihoCoder #1870 : Jin Yong’s Wukong Ranking List-闭包传递(递归) (ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction A) 2018 ICPC 北京区域赛现场赛A

    P1 : Jin Yong’s Wukong Ranking List Time Limit:1000ms Case Time Limit:1000ms Memory Limit:512MB Desc ...

  6. 2013 ACM/ICPC 长春网络赛E题

    题意:给出一个字符串,要从头.尾和中间找出三个完全相等的子串,这些串覆盖的区间互相不能有重叠部分.头.尾的串即为整个字符串的前缀和后缀.问这个相同的子串的最大长度是多少. 分析:利用KMP算法中的ne ...

  7. 2013 ACM/ICPC 长春网络赛F题

    题意:两个人轮流说数字,第一个人可以说区间[1~k]中的一个,之后每次每人都可以说一个比前一个人所说数字大一点的数字,相邻两次数字只差在区间[1~k].谁先>=N,谁输.问最后是第一个人赢还是第 ...

  8. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

  9. 2013 ACM/ICPC 南京网络赛F题

    题意:给出一个4×4的点阵,连接相邻点可以构成一个九宫格,每个小格边长为1.从没有边的点阵开始,两人轮流向点阵中加边,如果加入的边构成了新的边长为1的小正方形,则加边的人得分.构成几个得几分,最终完成 ...

随机推荐

  1. 《Cracking the Coding Interview》——第2章:链表——题目6

    2014-03-18 02:41 题目:给定一个带有环的单链表,找出环的入口节点. 解法1:用hash来检测重复节点肯定是容易想而且效率也高的好办法. 代码: // 2.6 You have a ci ...

  2. DOS程序员手册(十五)

    837页 writeln('TRACING Current Buffer==='); holdup; bcbtrc(cvtbase^.curbfr); writeln; holdup ; writel ...

  3. mongodb安装和配置三步走

    最近在重新学习node,所以和同事一起搞了个模仿新浪微博的项目,项目刚开始,所以其他的东西就暂时先不提.这里介绍下mongodb的安装.直接搜索可以看到很多介绍,但是我第一次是失败了,不过看了好几个还 ...

  4. 《移动App性能评测与优化》读书笔记

    第一章:内存   内存的主要组成索引: Native Heap:Native代码分配的内存,虚拟机和Android框架本身也会分配 Dalvik Heap:Java代码分配的对象 Dalvik Oth ...

  5. JMeter学习笔记(七) 导出文件接口测试

    导出文件接口,其实跟下载文件接口的测试类似,主要就是执行接口导出文件后保存到本地. 下载文件接口测试,参考文档:https://www.cnblogs.com/xiaoyu2018/p/1017830 ...

  6. 使用BootStrapValidator来完成前端输入验证

    BootStrapValidator可以用于完成基于BootStrap搭建的前端UI中的输入验证,由于本插件完全基于BootStrap因此可以和UI完美的融合在一起.下面直接上图,看看完成后的结果: ...

  7. 聊聊、Mybatis API

    API Mybatis 到底解决了什么问题,持久化框架是什么,没出现 Mybatis 之前我们又是怎么来操作数据库的呢?对于 Java语言 来说,JDBC标准 是比较底层的了,但并非最底层的,可以说 ...

  8. STL之map&multimap使用简介

    map 1.insert 第一种:用insert函数插入pair数据 #include <map> #include <string> #include <iostrea ...

  9. 九 DIP 依赖倒置原则

    首先看定义: 1.高层模块不依赖于低层模块,两者都应该依赖于抽象层 2.抽象不能依赖于细节,细节必须依赖于抽象 首先,模块是个抽象的概念,可以大到一个系统中的子系统作为一个模块,也可以是某个子系统中的 ...

  10. 【bzoj1070】[SCOI2007]修车 最小费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6798411.html 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的 ...