蓝桥杯:试题 算法训练 采油区域 矩阵前缀和+动态规划+分治+枚举
资源限制
时间限制: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;
}
蓝桥杯:试题 算法训练 采油区域 矩阵前缀和+动态规划+分治+枚举相关推荐
- Java实现 蓝桥杯VIP 算法训练 采油区域
算法训练 采油区域 时间限制:2.0s 内存限制:512.0MB 提交此题 查看参考代码 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整 ...
- 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解
题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...
- 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善
题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...
- 蓝桥杯 试题 算法训练 筛选号码 Java
蓝桥杯 试题 算法训练 筛选号码Java 算法训练 筛选号码 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3 ...
- 蓝桥杯 试题 算法训练 无聊的逗
蓝桥杯 试题 算法训练 无聊的逗 问题描述 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘 ...
- 蓝桥杯试题 算法训练 绘制地图
蓝桥杯试题 算法训练 绘制地图 问题描述 最近,WYF正准备参观他的点卡工厂.WYF集团的经理氰垃圾需要帮助WYF设计参"观"路线.现在,氰垃圾知道一下几件事情: 1.WYF的点卡 ...
- 蓝桥杯试题 算法训练 Have You Ever Heard About the Word?
试题 算法训练 Have You Ever Heard About the Word? 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 一个字符串的子串是该字符串的一段连续子序列,如 ...
- 蓝桥杯试题 算法训练 印章
试题 算法训练 印章 C/C++ 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 ...
- 蓝桥杯试题 算法训练 幂方分解
试题 算法训练 幂方分解 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 任何一个正整数都可以用2的幂次方表示.例如: 137=27+23+20 同时约定方次用括号来表示,即ab 可 ...
最新文章
- linux pyside2 安装包,Qt for Python 5.12发布下载,附PySide2和Shiboken2介绍
- python画饼状图的包_Python数据可视化:画饼状图、折线图、圈图
- REST 在 Java 中的使用
- elastic-job配置类
- 中科院大学计算机研究生考试大纲,中国科学院大学《计算机原理》2019年硕士研究生入学考试大纲...
- mit数据集_MIT的DNN硬件加速器教程(二)流行的DNN和数据集
- 计算机难点知识,(必先看)计算机文化基础知识难点
- 洛谷 P1080 国王游戏
- DevExpress v18.1新版亮点——WinForms篇(六)
- SWF文件反编译调试记录
- TLE82453-3SA-芯片手册
- python中re的group方法详解(来自官方文档的权威解释)
- 大数据时代,你应该知道的生活真相(下)
- 如何搭建 MTK 6577模拟器
- 算法设计技巧与分析(六):图遍历(Graph Traversal)
- MapReduce分片、分区、分组 傻傻分不清
- 内存测试内存检测工具
- 一文读懂天翼物联网平台(AIoT)
- 「5.29 开源市集参与指南」因为相信所以看见
- Office Web App
热门文章
- Arcgis中把背景值为0的图像背景改为nodate
- HNU软件能力实训2-17. 小A的计算器
- docker ps出错
- leetcode-1833. 雪糕的最大数量(排序+贪心)
- PostgreSQL 10.0 preview 功能增强 - 更强可靠性, 过去式事务状态可查(杜绝unknown事务)...
- hfs服务器 linux,(转)linux读写HFS+分区
- MOOC翁恺老师零基础学Java语言课程编程题——第六周
- 限定特定的IP访问服务器
- [渝粤教育] 天水师范学院 无机及分析化学 参考 资料
- 5G驻留比提升经验总结