2017 ICPC BeiJing Regional Hihocoder 1634 Puzzle Game
来源:互联网 发布:网络监控数据线连接 编辑:程序博客网 时间:2024/06/06 17:51
简略题意:给出一个n*m的矩阵,可以修改其中一个数字为p,使得最大子矩阵的值最小化。
暴力的做法就是n*m的枚举节点,然后每次
其实没有必要,假若我们求出了最大子矩阵唯一,那么我们只要枚举最大子矩阵的一个值修改之后,再求即可。
假若最大子矩阵不唯一,那么我们还是只要枚举任意一个最大子矩阵的值即可。因为如果两个最大子矩阵的有公共部分,那么答案必然可以被枚举到。如果没有公共部分,那么怎么修改都不会改变答案。
因此我只需要枚举任意一个最大子矩阵的所有点进行修改,想办法加速新图上最大子矩阵的求解即可。
对此我们只需要预处理出每个点上/下/左/右的最大子矩阵分别是多少。
令原来图的最大子矩阵的值为ans,那么新图的最大子矩阵即为max(ans - v[i][j] + p, L, R, U, D)。
复杂度
#define others#ifdef poj#include <iostream>#include <cstring>#include <cmath>#include <cstdio>#include <algorithm>#include <vector>#endif // poj#ifdef others#include <bits/stdc++.h>#endif // others//#define file#define all(x) x.begin(), x.end()using namespace std;const double eps = 1e-8;int dcmp(double x) { if(fabs(x)<=eps) return 0; return (x>0)?1:-1;};typedef long long LL;typedef unsigned long long ULL;void file() { freopen("out.txt", "r", stdin); freopen("out1.txt", "w", stdout);}namespace Solver { int n, m, p; const int maxn = 160; int L[maxn], R[maxn], U[maxn], D[maxn]; int v[maxn][maxn]; int S[maxn][maxn]; void solve() { while(~scanf("%d%d%d", &n, &m, &p)) { memset(L, -0x3f3f3f3f, sizeof L); memset(R, -0x3f3f3f3f, sizeof R); memset(U, -0x3f3f3f3f, sizeof U); memset(D, -0x3f3f3f3f, sizeof D); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf("%d", &v[i][j]), S[i][j] = S[i-1][j] + S[i][j-1] - S[i-1][j-1] + v[i][j]; int st, et; int sx, sy, ex, ey; int maxans = -0x3f3f3f3f; for(int i = n; i >= 1; i--) for(int j = i; j <= n; j++) { int x = 0; int ans = -0x3f3f3f3f; for(int k = 1; k <= m; k++) { int val = S[j][k] - S[i-1][k] - (S[j][k-1] - S[i-1][k-1]); if(x < 0) x = val; else x += val; ans = max(ans, x); } D[i-1] = max(D[i-1], max(D[i], ans)); maxans = max(maxans, ans); } for(int i = 1; i <= n; i++) for(int j = 1; j <= i; j++) { int x = 0; int ans = -0x3f3f3f3f; for(int k = 1; k <= m; k++) { int val = S[i][k] - S[j-1][k] - (S[i][k-1] - S[j-1][k-1]); if(x < 0) x = val; else x += val; ans = max(ans, x); } U[i+1] = max(U[i+1], max(U[i], ans)); } for(int i = 1; i <= m; i++) for(int j = 1; j <= i; j++) { int x = 0; int ans = -0x3f3f3f3f; for(int k = 1; k <= n; k++) { int val = S[k][i] - S[k][j-1] - (S[k-1][i] - S[k-1][j-1]); if(x < 0) x = val; else x += val; ans = max(ans, x); } L[i+1] = max(L[i+1], max(L[i], ans)); } for(int i = m; i >= 1; i--) for(int j = i; j <= m; j++) { int x = 0; int ans = -0x3f3f3f3f; for(int k = 1; k <= n; k++) { int val = S[k][j] - S[k][i-1] - (S[k-1][j] - S[k-1][i-1]); if(x < 0) x = val; else x += val; ans = max(ans, x); } R[i-1] = max(R[i-1], max(R[i], ans)); } for(int i = 1; i <= n; i++) for(int j = i; j <= n; j++) { int x = 0; int ans = -0x3f3f3f3f; st = 1; for(int k = 1; k <= m; k++) { int val = S[j][k] - S[i-1][k] - (S[j][k-1] - S[i-1][k-1]); if(x < 0) st = k, x = val; else x += val; if(x == maxans) { et = k; sx = i, sy = st, ex = j, ey = et; goto LOOP; } } } LOOP: ; int fans = maxans; for(int i = sx; i <= ex; i++) for(int j = sy; j <= ey; j++) { fans = min(fans, max(maxans - v[i][j] + p, max(L[j], max(R[j], max(U[i], D[i]))))); } cout<<fans<<endl; } }}int main() {// file(); Solver::solve(); return 0;}
阅读全文
0 0
- 2017 ICPC BeiJing Regional Hihocoder 1634 Puzzle Game
- 2017 ICPC BeiJing Regional Hihocoder 1629 Graph
- 2017 ICPC 北京站 H (hihocoder 1634) Puzzle Game (dp 最大子矩阵和)
- hihocoder 1580 Matrix 1634 Puzzle Game
- 2017Beijing icpc E Cats and Fish HihoCoder
- 2015 ACM/ICPC Asia Regional Beijing Online
- 2015 ACM/ICPC Asia Regional Shenyang Online 1007 hdu 5456 Matches Puzzle Game
- HDU 5456 Matches Puzzle Game(2015 ACM/ICPC Asia Regional Shenyang Online)
- HihoCoder 1249(2015 Asia Beijing Regional Contest)
- HihoCoder 1255(2015 Asia Beijing Regional Contest)
- HihoCoder 1257(2015 Asia Beijing Regional Contest)
- HihoCoder 1258(2015 Asia Beijing Regional Contest)
- hdu 5036 Explosion 2014 ACM/ICPC Asia Regional Beijing Online
- hdu 5033 Building 2014 ACM/ICPC Asia Regional Beijing Online
- 2014 ACM/ICPC Asia Regional Beijing Online HDU 5038
- hdu 5033 Building 2014 ACM/ICPC Asia Regional Beijing Online
- ACM-ICPC 2014 Beijing Regional / hdu 5115 区间DP
- 【题解】 2015 ACM-ICPC Asia Regional Beijing Online (3+2)
- 深度学习框架---keras的层次示意图---方便直观理解---适用sklearn模型的展示
- 百度地图API使用到的几个方法总结
- 考试总结18
- C语言中的随机数生成器
- 菱形继承--菱形虚拟继承
- 2017 ICPC BeiJing Regional Hihocoder 1634 Puzzle Game
- java 第三章 运算符,表达式和语句
- MT9M031/OV7251 usb 3.0 & mipi bridge
- 模仿“百度”页面的html代码
- python-实现键盘记录器
- 56. SAMBA 服务器
- 【智力题】烧绳子
- RHEL/CentOS 7 系统上源码编译安装nginx,并隐藏替换nginx名称
- sticky.html