[BZOJ1177][Apio2009]Oil

试题描述

采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。 Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示为M×N个非负整数,即对每一小块土地石油储量的估计值。 为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K块相连的土地构成的正方形区域。 AoE石油联合公司由三个承包商组成,他们想选择三块互不相交的K×K的区域使得总的收益最大。 例如,假设石油储量的估计值如下: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 8 8 8 8 8 1 1 1 1 8 8 8 8 8 1 1 1 1 8 8 8 8 8 1 1 1 1 1 1 1 8 8 8 1 1 1 1 1 1 1 1 8 8 8 1 1 1 1 1 1 9 9 9 1 1 1 1 1 1 9 9 9 如果K = 2, AoE公司可以承包的区域的石油储量总和为100, 如果K = 3, AoE公司可以承包的区域的石油储量总和为208。 AoE公司雇佣你来写一个程序,帮助计算出他们可以承包的区域的石油储量之和的最大值。

输入

输入第一行包含三个整数M, N, K,其中M和N是矩形区域的行数和列数,K是每一个承包商承包的正方形的大小(边长的块数)。接下来M行,每行有N个非负整数表示这一行每一小块土地的石油储量的估计值

输出

输出只包含一个整数,表示AoE公司可以承包的区域的石油储量之和的最大值。

输入示例

9 9 3
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 1 1 1 8 8 8 1 1
1 1 1 1 1 1 8 8 8
1 1 1 1 1 1 9 9 9
1 1 1 1 1 1 9 9 9

输出示例

208

数据规模及约定

0 < n, m < 2501, 答案不超过int, 0 < k < min{ n, m }且保证有方案

题解

马丹智障题。。。我来吐槽一下:

1.) 这题是一道恶心dp题(我分了14种情况讨论)

2.) 这题大视野题面上没有范围,并且此题“讨论”中所发的范围是错的!

3.) 这题数据有问题,不能用任何读入优化

4.) 这题卡内存

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;#define maxn 2505
#define LL int
#define h f[0]
#define t g[0]
int n, m, K;
LL S[maxn][maxn], f[2][maxn][maxn], g[2][maxn][maxn];LL sum(int x1, int y1, int x2, int y2) { return S[x2][y2] - S[x1][y2] - S[x2][y1] + S[x1][y1]; }int main() {
//  freopen("data.in", "r", stdin);scanf("%d%d%d", &n, &m, &K);
//  n = read(); m = read(); K = read();LL ans = 0;for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++) {int tmp; scanf("%d", &tmp);S[i][j] = S[i-1][j] - S[i-1][j-1] + S[i][j-1] + tmp;}f[0][K][K] = S[K][K];for(int i = K; i <= n; i++)for(int j = K; j <= m; j++) {f[0][i][j] = max(max(f[0][i-1][j], f[0][i][j-1]), sum(i-K, j-K, i, j));f[1][i][j] = max(max(f[1][i-1][j], f[1][i][j-1]), sum(i-K, j-K, i, j) + max(f[0][i-K][j], f[0][i][j-K]));}g[0][n-K+1][m-K+1] = sum(n-K, m-K, n, m);for(int i = n-K+1; i; i--)for(int j = m-K+1; j; j--) {g[0][i][j] = max(max(g[0][i+1][j], g[0][i][j+1]), sum(i-1, j-1, i+K-1, j+K-1));g[1][i][j] = max(max(g[1][i+1][j], g[1][i][j+1]), sum(i-1, j-1, i+K-1, j+K-1) + max(g[0][i+K][j], g[0][i][j+K]));}for(int i = 1; i <= n-K+1; i++)for(int j = 1; j <= m-K+1; j++) {LL tmp = sum(i-1, j-1, i+K-1, j+K-1);ans = max(ans, tmp + f[1][i-1][m]);ans = max(ans, tmp + f[1][n][j-1]);ans = max(ans, tmp + g[1][1][j+K]);ans = max(ans, tmp + g[1][i+K][1]);ans = max(ans, tmp + f[0][i-1][j+K-1] + g[0][1][j+K]);ans = max(ans, tmp + f[0][i-1][m] + g[0][i][j+K]);ans = max(ans, tmp + f[0][i-1][m] + g[0][i+K][1]);ans = max(ans, tmp + f[0][i+K-1][j-1] + g[0][i+K][1]);ans = max(ans, tmp + f[0][n][j-1] + g[0][i+K][j]);ans = max(ans, tmp + f[0][n][j-1] + g[0][1][j+K]);}memset(h, 0, sizeof(h));h[K][m-K+1] = sum(0, m-K, K, m);for(int i = K; i <= n; i++)for(int j = m-K+1; j; j--)h[i][j] = max(max(h[i-1][j], h[i][j+1]), sum(i-K, j-1, i, j+K-1));memset(t, 0, sizeof(t));t[n-K+1][K] = sum(n-K, 0, n, K);for(int i = n-K+1; i; i--)for(int j = K; j <= m; j++)t[i][j] = max(max(t[i+1][j], t[i][j-1]), sum(i-1, j-K, i+K-1, j));for(int i = 1; i <= n-K+1; i++)for(int j = 1; j <= m-K+1; j++) {LL tmp = sum(i-1, j-1, i+K-1, j+K-1);ans = max(ans, tmp + t[i+K][m] + h[i+K-1][j+K]);ans = max(ans, tmp + t[i+K][j+K-1] + h[n][j+K]);ans = max(ans, tmp + t[1][j-1] + h[i-1][j]);ans = max(ans, tmp + t[i][j-1] + h[i-1][1]);}printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5424556.html

[BZOJ1177][Apio2009]Oil相关推荐

  1. BZOJ-1177 [Apio2009]Oil

    解题思路: 一种非常神奇的枚举策略...不过这种枚举策略...是需要DP来完成的 嘛...这种神奇的题目我独立肯定是做不来的...所以我是看着这篇博客写的...传送门 嘛...这篇博客好就好在...你 ...

  2. 2019.4.summary

    2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...

  3. 重走长征路---OI每周刷题记录---4月12日 2015

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  4. 题目1460:Oil Deposit

    题目描述: The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. ...

  5. L - Oil Deposits HDU - 1241

    L - Oil Deposits HDU - 1241 注意写check的时候要先判x,y是不是越界了,不然直接用数组可能RE, 也可能直接WA了 #include<cstdio> #in ...

  6. UVa572 Oil Deposits DFS求连通块

    技巧:遍历8个方向 for(int dr = -1; dr <= 1; dr++)for(int dc = -1; dc <= 1; dc++)if(dr != 0 || dc != 0) ...

  7. HDU-1241 Oil Deposits (DFS)

    Oil Deposits Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  8. OIL + VCache如何改善Facebook视频延迟 并减少存储和计算开销?

    OIL将存储空间抽象化,并与分布式缓存系统VCache配合,降低了Facebook视频延迟的同时,并减少了存储与计算开销.感谢赵化强.李东明完成本文技术审校. 文 / Roberto J Peon, ...

  9. Oil Deposit

    题目描述: The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. ...

最新文章

  1. oracle的addm,addm报告分析 - Oracle数据库管理 - ITPUB论坛-中国专业的IT技术社区
  2. url参数传递 java_URL中文参数传递问题
  3. Flex,Fms3相关文章索引(2009-3-25更新)
  4. ruby连接mysql
  5. Dos中重定向与文件追加
  6. 【操作系统】处理机调度-思维导图
  7. 个推如何管理亿级代码的质量?持续集成SonarQube 代码质量管理系统
  8. 利用R语言美化决策树
  9. PRD之道:4个撰写PRD的关键思路
  10. 这不是海市蜃楼,这是平地雾
  11. linux编译安装openssl-3.0.2
  12. Oracle数据库常用的管理工具介绍
  13. gcc编译部分编译选项
  14. 【转】2008'中国地理信息系统优秀工程公示
  15. 第五章运算符表达式和语句
  16. 台灯照度均匀度多少最好?2022最新护眼灯照度标准值
  17. 计算机安装win10配置,win11发布了,那么安装win11配置要求是什么?win11配置要求详解...
  18. Linux部署springboot项目(从安装java开始)
  19. js通过身份证号获取出生年月日,性别,年龄
  20. SourceTree提交代码报错git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\honry

热门文章

  1. 使用 ApplicationLoader 上传应用到 Appstore
  2. AppleScript 快速入门
  3. 判断能被N整除的字符串
  4. 用C++11 实现 thread pool
  5. CentOS 7 的 32 位版发布
  6. 7添加静态路由 hat red_两个不同网段的路由器,如何互通?
  7. C++ list::splice()用法
  8. 汇编转跳指令 (J开头的)
  9. Java数三退一问题代码_数三退一问题算法(Java)
  10. java 有选择的查询_如何在Java中将准备好的语句用于选择查询?