[APIO2009] 采油区域:动态规划

news/2025/3/12 12:29:08/

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

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

输入:
输入第一行包含三个整数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

解题思路:动态规划问题,使用递推,先将小问题的解求出来,然后再解决大问题。递推+前缀和
一个矩形,分三块,有六种方法 如图:
在这里插入图片描述在这里插入图片描述

分别在三个部分中找的k*k面积最大的,加起来就是答案
那么怎么表示这三个块中面积最大的呢?
就需要记录对于每个点
它左上,右上,左下,右下的四个部分中,最大的K * K块的价值和
这个样子:

int a[2000][2000], b[2000][2000], c[2000][2000], d[2000][2000];
//a表示左上,b表示右上,c表示左下,d表示右下

先将循环用define简化:

#define FI for(int i=1;i<=n;i++)
#define FJ for(int j=1;j<=m;j++)
#define FDI for(int i=n;i>=k;i--)
#define FDJ for(int j=m;j>=k;j--)
#define FUI for(int i=k;i<=n;i++)
#define FUJ for(int j=k;j<=m;j++)
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define per(i,x,y) for(int i=x;i>=y;i--)

用数组mp先表示以i,j点为右下角的的矩形(注意不是k*k的矩形)的储油量之和,然后通过循环再计算用mp表示以i,j为右下角的k * k的矩形的储油量之和:

	FI FJ{cin>>temp;pos[i][j] = pos[i - 1][j] + pos[i][j - 1] - pos[i - 1][j - 1] + temp;}FDI FDJ pos[i][j] -= pos[i - k][j] + pos[i][j - k] - pos[i - k][j - k];

再通过递推公式计算出左上角,右上角,左下角,右下角的储油量最大值:

	FUI FUJ a[i][j] = max(pos[i][j], max(a[i - 1][j], a[i][j - 1]));FUI FDJ b[i][j] = max(pos[i][j], max(b[i - 1][j], b[i][j + 1]));FDI FUJ c[i][j] = max(pos[i][j], max(c[i + 1][j], c[i][j - 1]));FDI FDJ d[i][j] = max(pos[i][j], max(d[i + 1][j], d[i][j + 1]));

在根据上面分析的六种情况,算出最大的储油量res:

	rep(i, k, n - k) rep(j, k, m - k) res = max(res, a[i][j] + b[i][j + k] + c[i + k][m]);rep(i, k, n - k) rep(j, k, m - k) res = max(res, a[i][m] + c[i + k][j] + d[i + k][j + k]);rep(i, k, n - k) rep(j, k, m - k) res = max(res, a[i][j] + b[n][j + k] + c[i + k][j]);rep(i, k, n - k) rep(j, k, m - k) res = max(res, a[n][j] + b[i][j + k] + d[i + k][j + k]);rep(i, k, n - k) rep(j, k + k, m - k) res = max(res, a[n][j - k] + b[n][j + k] + pos[i][j]);rep(i, k + k, n - k) rep(j, k, m - k) res = max(res, a[i - k][m] + c[i + k][m] + pos[i][j]);

最终输出res:

cout << res;

完整代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>//定义循环符号
#define FI for(int i=1;i<=n;i++)
#define FJ for(int j=1;j<=m;j++)
#define FDI for(int i=n;i>=k;i--)
#define FDJ for(int j=m;j>=k;j--)
#define FUI for(int i=k;i<=n;i++)
#define FUJ for(int j=k;j<=m;j++)
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define per(i,x,y) for(int i=x;i>=y;i--)
using namespace std;int a[2000][2000], b[2000][2000], c[2000][2000], d[2000][2000];
//a表示左上,b表示右上,c表示左下,d表示右下
int pos[2000][2000];
int n, m, k;int main() {cin>>n>>m>>k;int temp;int res = 0;FI FJ{cin>>temp;pos[i][j] = pos[i - 1][j] + pos[i][j - 1] - pos[i - 1][j - 1] + temp;}FDI FDJ pos[i][j] -= pos[i - k][j] + pos[i][j - k] - pos[i - k][j - k];FUI FUJ a[i][j] = max(pos[i][j], max(a[i - 1][j], a[i][j - 1]));FUI FDJ b[i][j] = max(pos[i][j], max(b[i - 1][j], b[i][j + 1]));FDI FUJ c[i][j] = max(pos[i][j], max(c[i + 1][j], c[i][j - 1]));FDI FDJ d[i][j] = max(pos[i][j], max(d[i + 1][j], d[i][j + 1]));rep(i, k, n - k) rep(j, k, m - k) res = max(res, a[i][j] + b[i][j + k] + c[i + k][m]);rep(i, k, n - k) rep(j, k, m - k) res = max(res, a[i][m] + c[i + k][j] + d[i + k][j + k]);rep(i, k, n - k) rep(j, k, m - k) res = max(res, a[i][j] + b[n][j + k] + c[i + k][j]);rep(i, k, n - k) rep(j, k, m - k) res = max(res, a[n][j] + b[i][j + k] + d[i + k][j + k]);rep(i, k, n - k) rep(j, k + k, m - k) res = max(res, a[n][j - k] + b[n][j + k] + pos[i][j]);rep(i, k + k, n - k) rep(j, k, m - k) res = max(res, a[i - k][m] + c[i + k][m] + pos[i][j]);cout << res;system("pause");return 0;
}

http://www.ppmy.cn/news/523619.html

相关文章

大学里

每个安慰你挂科算什么的人 最后都默默拿了奖学金&#xff1b; 每个夸你肥嘟嘟的脸好可爱的人&#xff0c; 最后都瘦成了万人迷&#xff1b; 每个在你面前说自己前途渺茫的人&#xff0c; 最后都身家过亿&#xff1b; 只有你&#xff0c; 在满床的薯片袋和电脑荧光照射下&#x…

表情识别论文《OAENet Oriented Attention Ensemble for Accurate FacialExpression Recognition》中文翻译

本篇博客为论文OAENet: Oriented Attention Ensemble for Accurate Facial Expression Recognition的中文翻译&#xff0c;如有翻译错误请见谅&#xff0c;同时希望您能为我提出改正建议&#xff0c;谢谢&#xff01; 论文链接&#xff1a;https://www.sciencedirect.com/scie…

腾讯员工用漫画自述悲惨职场经历,网友大呼:社会巨婴

最近微博上有几组“漫画”火了&#xff0c;但是却引发了巨大的争议&#xff0c;漫画作者微博昵称为“知春鹿可不这么想”&#xff0c;作者自称是腾讯的实习生&#xff0c;并通过漫画的形式描述着自己秋招、面试、实习等生活状态。 这是其中一篇漫画。 很多网友直接说出作者就是…

无线传感器网络:网络层

文章目录 Challenges for RoutingEnergy EfficiencyScalabilityAddressingRobustnessTopologyApplication Routing MetricsQuality-of-Service (QoS)Minimum HopEnergyMinimum energy consumed per packetMaximum time to network partitionMaximum average energy capacityMax…

元宇宙虚拟人迎来高峰期,哪个是你的最爱?

虚拟人从最初的不温不火&#xff0c;到现在步入“出生高峰期”&#xff0c;元宇宙可以说是功不可没。 此前&#xff0c;量子位发布了《虚拟数字人深度产业报告》&#xff0c;报告显示&#xff0c;到2030年我国虚拟数字人整体市场规模将达到2700亿元。其中&#xff0c;“身份型…

[29期] 程序员,你迷茫啥呢?

在CSDN上偶尔看到的&#xff0c;感觉挺好的。分享一下。 你要是天天一大早六点起床&#xff0c;刷牙洗脸&#xff0c;吃顿早点&#xff0c;7点不到就去挤地铁公交&#xff0c;使劲的小心不被挤成饼。9点就老老实实的坐在办公室里打开电脑&#xff0c;望着领导。中午一个小时吃饭…

流利阅读12.28 Seriously, Prada, what were you thinking? Why the fashion industry keeps bumbling into rac

下载pdf资料&#xff1a; GitHub - zhbink/LiuLiYueDu: 流利阅读pdf汇总 流利阅读对每期内容均有很好的文章讲解&#xff0c;向您推荐。 您可以关注微信公众号&#xff1a;流利阅读 了解详情。 Seriously, Prada, what were you thinking? Why the fashion industry keeps bum…

【AI视野·今日CV 计算机视觉论文速览 第228期】Tue, 29 Jun 2021

AI视野今日CS.CV 计算机视觉论文速览 Tue, 29 Jun 2021 (showing first 100 of 120 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;*****提升Transformer训练稳定性与性能的早期卷积层, (from FAIR) &#x1f4da;***CC…