题意:给一个n*m的矩阵,你只能选择一个格子把这个格子的数换成p(也可以一个都不换),问最大子矩阵和最小可能是多少?

思路:

思路就是上面这个思路,这里简单讲一下怎么n^3求最大子矩阵和:枚举两行(或者两列),然后把每一列之和看做一个数字,这样二维就变成了一维,我们可以直接求最大子串和的方法。初始一个ret为0,然后从左往右加,如果ret<0,那么把ret初始化0,负数作为初始值肯定比重新开始小,然后找出ret的最大值就是最大子矩阵和。

代码:

#include<cstdio>
#include<cstring>
typedef long long ll;
using namespace std;
const int maxn = + ;
const int MOD = 1e9 + ;
const int INF = 0x3f3f3f3f;
int num[maxn][maxn], sum[maxn][maxn];
int up[maxn], down[maxn], left[maxn], right[maxn];
int n, m, p, xx1, yy1, xx2, yy2;
int min(int x, int y){
return x < y? x : y;
}
int max(int x, int y){
return x > y? x : y;
}
int mat(int x1, int y1, int x2, int y2){
return sum[x2][y2] - sum[x1 - ][y2] - sum[x2][y1 - ] + sum[x1 - ][y1 - ];
}
int main(){
while(~scanf("%d%d%d", &n, &m, &p)){
memset(sum, , sizeof(sum));
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
scanf("%d", &num[i][j]);
sum[i][j] = num[i][j] + sum[i - ][j] + sum[i][j - ] - sum[i - ][j - ];
}
} //上下左右四个矩阵预处理
memset(up, -INF ,sizeof(up));
for(int i = ; i <= n; i++){
int tmp = -INF;
for(int j = ; j <= i; j++){
int ret = ;
for(int k = ; k <= m; k++){
ret += mat(j, k, i, k);
tmp = max(tmp, ret);
if(ret < ) ret = ;
}
}
up[i] = max(up[i - ], tmp);
}
memset(down, -INF, sizeof(down));
for(int i = n; i >= ; i--){
int tmp = -INF;
for(int j = i; j <= n; j++){
int ret = ;
for(int k = ; k <= m; k++){
ret += mat(i, k, j, k);
tmp = max(tmp, ret);
if(ret < ) ret = ;
}
}
down[i] = max(down[i + ], tmp);
}
memset(left, -INF, sizeof(left));
for(int i = ; i <= m; i++){
int tmp = -INF;
for(int j = ; j <= i; j++){
int ret = ;
for(int k = ; k <= n; k++){
ret += mat(k, j, k, i);
tmp = max(ret, tmp);
if(ret < ) ret = ;
}
}
left[i] = max(left[i - ], tmp);
}
memset(right, -INF, sizeof(right));
for(int i = m; i >= ; i--){
int tmp = -INF;
for(int j = i; j <= m; j++){
int ret = ;
for(int k = ; k <= n; k++){
ret += mat(k, i, k, j);
tmp = max(ret, tmp);
if(ret < ) ret = ;
}
}
right[i] = max(right[i + ], tmp);
} int Max = -INF;
for(int i = ; i <= n; i++){
for(int j = ; j <= i; j++){
int ret = , start = ;;
for(int k = ; k <= m; k++){
ret += mat(j, k, i, k);
if(ret > Max){
Max = ret;
xx1 = j, yy1 = start, xx2 = i, yy2 = k;
}
if(ret < ) ret = , start = k + ;
}
}
}
int ans = Max;
for(int i = xx1; i <= xx2; i++){
for(int j = yy1; j <= yy2; j++){
if(p > num[i][j]) continue;
ans = min(ans , max(Max - num[i][j] + p, max(up[i - ], max(down[i + ], max(left[j - ], right[j + ])))));
}
}
printf("%d\n", ans);
}
return ;
}

HihoCoder 1634 Puzzle Game(最大子矩阵和)题解的更多相关文章

  1. Hihocoder 1634 Puzzle Game(2017 ACM-ICPC 北京区域赛 H题,枚举 + 最大子矩阵变形)

    题目链接  2017 Beijing Problem H 题意  给定一个$n * m$的矩阵,现在可以把矩阵中的任意一个数换成$p$,求替换之后最大子矩阵的最小值. 首先想一想暴力的方法,枚举矩阵中 ...

  2. Puzzle Game HihoCoder - 1634

    题目链接:https://cn.vjudge.net/problem/HihoCoder-1634 题目意思:可以让矩阵里的某一个数变成p,或者不修改.求最大子矩阵最小,输出最小值. 思路:请看下图 ...

  3. ZOJ 1602 Multiplication Puzzle(区间DP)题解

    题意:n个数字的串,每取出一个数字的代价为该数字和左右的乘积(1.n不能取),问最小代价 思路:dp[i][j]表示把i~j取到只剩 i.j 的最小代价. 代码: #include<set> ...

  4. hihocoder #1301 : 筑地市场 数位dp+二分

    题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostr ...

  5. hihocoder #1224 : 赛车 dfs

    #1224 : 赛车 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/1224 ...

  6. 牛客网暑期ACM多校训练营(第二场)carpet

    传送门:carpet 题意 有一个n*m的地毯,aij表示地毯每格的元素,bij表示地毯每格的价格,要求选取一块价格最大值最小的地毯,并且这块地毯无限铺开之后,原地毯是其子矩阵. 题解 先找到这个矩阵 ...

  7. NOI题库 1768最大子矩阵 题解

    NOI题库 1768最大子矩阵  题解     总时间限制: 1000ms 内存限制: 65536kB   描述   已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...

  8. 【题解】Puzzle [Uva1399]

    [题解]Puzzle [Uva1399] 传送门:\(\text{Puzzle [Uva1399]}\) [题目描述] 给定 \(m\) 和 \(n\),表示有 \(m\) 种不同的字符(大写字母\( ...

  9. hihoCoder [Offer收割]编程练习赛3 D子矩阵求和

    子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...

随机推荐

  1. UVa-116 Unidirectional TSP 单向旅行商

    题目 https://vjudge.net/problem/uva-116 分析 设d[i][j]为从(i,j)到最后一列的最小开销,则d[i][j]=a[i][j]+max(d[i+1][j+1], ...

  2. table 的rolspan和rowspan

    如图所示啦,容易让初学者混乱的两个东西仔细看看分析下呢,就比较简单了 <table width="300" border="2"> <tr&g ...

  3. html5-css的使用强制优先级

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. arc 093 D – Grid Components

    题意: 给出A和B,要求构造出一个具有A个白色连通块和B个黑色连通块的矩阵. 这个矩阵的长和宽最多为100. 思路: 试想如果横着每个点同类的点隔着一个不同的点,竖着每个同类的点隔着一个不同的点,那么 ...

  5. Linux 软件安装卸载命令

    安装方式一: RPM 命令 rpm -qa|grep java  查看java 是否安装 rpm -e --nodeps  软件名   卸载已安装软件 rpm -ivh xxx.rpm   安装 安装 ...

  6. 20165215 2017-2018-2 《Java程序设计》第7周学习总结

    20165215 2017-2018-2 <Java程序设计>第七周学习总结 教材学习内容总结 chapter11 下载安装MySQL服务器 启动MySQL数据库服务器 在bin子目录中, ...

  7. 抓取https网页时,报错sun.security.validator.ValidatorException: PKIX path building failed 解决办法

    抓取https网页时,报错sun.security.validator.ValidatorException: PKIX path building failed 解决办法 原因是https证书问题, ...

  8. freemark、jsp&css

    **************************************************************freemark相关**************************** ...

  9. 解决Win 10上SSD缓慢问题

    标准硬盘驱动器(HDD)由于其高存储容量和低成本而长期以来一直是计算机的主要存储设备.固态硬盘(SSD)是另一种存储解决方案,正在逐步取代大多数硬盘驱动器.但是,随着时间的推移,SSD会因各种原因而大 ...

  10. 高级架构进阶之HashMap源码就该这么学

    引言--面试常见的问题 问:“你用过HashMap,你能跟我说说它吗?” “当然用过,HashMap是一种<key,value>的存储结构,能够快速将key的数据put方式存储起来,然后很 ...