资源限制
时间限制:2.0s 内存限制:512.0MB

采油区域  
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公司可以承包的区域的石油储量之和的最大值。

数据规模和约定
数据保证K≤M且K≤N并且至少有三个K×K的互不相交的正方形区域。其中30%的输入数据,M, N≤ 12。所有的输入数据, M, N≤ 1500。每一小块土地的石油储量的估计值是非负整数且≤ 500。

样例输入

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

思路

很麻烦的一个题,首先加和的话肯定先算前缀和,常数时间查询一个子矩阵的加和
【关于矩阵前缀和】

然后划分出3个不相交的子矩阵,一共有6中划分方式,这里体现了分治思想

那么如何算每一块的最大值呢?这里要用到动态规划了,而且动态规划要求解四次,分别对应四个问题:

  • 矩阵【左上角到(x, y)】的子矩阵中最大加和的k*k的矩阵
  • 矩阵【右上角到(x, y)】的子矩阵中最大加和的k*k的矩阵
  • 矩阵【左下角到(x, y)】的子矩阵中最大加和的k*k的矩阵
  • 矩阵【右下角到(x, y)】的子矩阵中最大加和的k*k的矩阵

【关于这个应用的动态规划求解】

用四个dp数组,分别为 ul, ur, dl, dr,表示上述四个动态规划问题的解数组

上述方法求得四个dp矩阵,那么可以开始暴力穷举每一种分法的边界,这里体现了枚举思想

对于1-4种分法,穷举点,比如分法3,点将矩阵分为三个区域:左上,左下,右边

对于5-6种分法,穷举中间的两个横杠,横杠的间距为k,那么问题变为:上面,中间,下面

上下的最值好求,中间的最值需要枚举另一坐标轴,滑动一个k*k的矩阵,这矩阵夹在两横杠中间滑动,寻找最大值

代码

#include <bits/stdc++.h>using namespace std;int a[1509][1509], ul[1509][1509], ur[1509][1509], dl[1509][1509], dr[1509][1509];
int m, n, k;int kksum(int x1, int y1, int x2, int y2)
{return a[x2][y2]-a[x1-1][y2]-a[x2][y1-1]+a[x1-1][y1-1];
}int main()
{   cin>>m>>n>>k;memset(a, 0, sizeof(a));memset(ul, 0, sizeof(ul));memset(ur, 0, sizeof(ur));memset(dl, 0, sizeof(dl));memset(dr, 0, sizeof(dr));// 计算行前缀和 for(int i=1; i<=m; i++)for(int j=1; j<=n; j++) cin>>a[i][j], a[i][j]+=a[i][j-1]; // 计算列前缀和 for(int i=1; i<=m; i++)for(int j=1; j<=n; j++)a[i][j] += a[i-1][j];// ulfor(int i=k; i<=m; i++)for(int j=k; j<=n; j++)ul[i][j] = max(kksum(i-k+1, j-k+1, i, j), max(ul[i-1][j], ul[i][j-1]));// ur   for(int i=k; i<=m; i++)for(int j=n-k+1; j>=1; j--)ur[i][j] = max(kksum(i-k+1, j, i, j+k-1), max(ur[i-1][j], ur[i][j+1]));// dl     for(int i=m-k+1; i>=1; i--)for(int j=k; j<=n; j++)dl[i][j] = max(kksum(i, j-k+1, i+k-1, j), max(dl[i+1][j], dl[i][j-1]));// dr for(int i=m-k+1; i>=1; i--)for(int j=n-k+1; j>=1; j--) dr[i][j] = max(kksum(i, j, i+k-1, j+k-1), max(dr[i+1][j], dr[i][j+1]));int ans = 0;// 枚举点,对应分法1-4 for(int i=1; i+1<=m; i++){for(int j=1; j+1<=n; j++){ans = max(ans, ul[i][n]+dl[i+1][j]+dr[i+1][j+1]);ans = max(ans, dr[i+1][1]+ul[i][j]+ur[i][j+1]);ans = max(ans, ur[m][j+1]+ul[i][j]+dl[i+1][j]);ans = max(ans, dl[1][j]+ur[i][j+1]+dr[i+1][j+1]);}}// 枚举中间的横杠,对应分法5-6 for(int i=k; i+k+1<=m; i++){int up = ul[i][n];int dw = dl[i+k+1][n];int mid = 0;for(int j=k; j<=n; j++)mid = max(mid, kksum(i+1, j-k+1, i+k, j));ans = max(ans, up+dw+mid);}        for(int j=k; j+k+1<=n; j++){int le = max(ul[k][j], dl[k+1][j]);int ri = max(ur[k][j+k+1], dr[k+1][j+k+1]);int mid = 0;for(int i=k; i<=m; i++)mid = max(mid, kksum(i-k+1, j+1, i, j+k));ans = max(ans, le+ri+mid);}cout<<ans<<endl;return 0;
}

蓝桥杯:试题 算法训练 采油区域 矩阵前缀和+动态规划+分治+枚举相关推荐

  1. Java实现 蓝桥杯VIP 算法训练 采油区域

    算法训练 采油区域 时间限制:2.0s 内存限制:512.0MB 提交此题 查看参考代码 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整 ...

  2. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  3. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  4. 蓝桥杯 试题 算法训练 筛选号码 Java

    蓝桥杯 试题 算法训练 筛选号码Java 算法训练 筛选号码 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3 ...

  5. 蓝桥杯 试题 算法训练 无聊的逗

    蓝桥杯 试题 算法训练 无聊的逗 问题描述 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘 ...

  6. 蓝桥杯试题 算法训练 绘制地图

    蓝桥杯试题 算法训练 绘制地图 问题描述 最近,WYF正准备参观他的点卡工厂.WYF集团的经理氰垃圾需要帮助WYF设计参"观"路线.现在,氰垃圾知道一下几件事情: 1.WYF的点卡 ...

  7. 蓝桥杯试题 算法训练 Have You Ever Heard About the Word?

    试题 算法训练 Have You Ever Heard About the Word? 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 一个字符串的子串是该字符串的一段连续子序列,如 ...

  8. 蓝桥杯试题 算法训练 印章

    试题 算法训练 印章 C/C++ 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 ...

  9. 蓝桥杯试题 算法训练 幂方分解

    试题 算法训练 幂方分解 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 任何一个正整数都可以用2的幂次方表示.例如: 137=27+23+20 同时约定方次用括号来表示,即ab 可 ...

最新文章

  1. linux pyside2 安装包,Qt for Python 5.12发布下载,附PySide2和Shiboken2介绍
  2. python画饼状图的包_Python数据可视化:画饼状图、折线图、圈图
  3. REST 在 Java 中的使用
  4. elastic-job配置类
  5. 中科院大学计算机研究生考试大纲,中国科学院大学《计算机原理》2019年硕士研究生入学考试大纲...
  6. mit数据集_MIT的DNN硬件加速器教程(二)流行的DNN和数据集
  7. 计算机难点知识,(必先看)计算机文化基础知识难点
  8. 洛谷 P1080 国王游戏
  9. DevExpress v18.1新版亮点——WinForms篇(六)
  10. SWF文件反编译调试记录
  11. TLE82453-3SA-芯片手册
  12. python中re的group方法详解(来自官方文档的权威解释)
  13. 大数据时代,你应该知道的生活真相(下)
  14. 如何搭建 MTK 6577模拟器
  15. 算法设计技巧与分析(六):图遍历(Graph Traversal)
  16. MapReduce分片、分区、分组 傻傻分不清
  17. 内存测试内存检测工具
  18. 一文读懂天翼物联网平台(AIoT)
  19. 「5.29 开源市集参与指南」因为相信所以看见
  20. Office Web App

热门文章

  1. Arcgis中把背景值为0的图像背景改为nodate
  2. HNU软件能力实训2-17. 小A的计算器
  3. docker ps出错
  4. leetcode-1833. 雪糕的最大数量(排序+贪心)
  5. PostgreSQL 10.0 preview 功能增强 - 更强可靠性, 过去式事务状态可查(杜绝unknown事务)...
  6. hfs服务器 linux,(转)linux读写HFS+分区
  7. MOOC翁恺老师零基础学Java语言课程编程题——第六周
  8. 限定特定的IP访问服务器
  9. [渝粤教育] 天水师范学院 无机及分析化学 参考 资料
  10. 5G驻留比提升经验总结