当前位置: 首页 > news >正文

P3625 采油区域-分类讨论

P3625 采油区域-分类讨论

题意总结

在给定的 \(N*M\) 的矩形中,选出三个不重合的 \(k*k\) 的区域,使得权值和最大。

思路

第一眼想到了dp,类似于P1004的方格取数,开个三维取存选了那些点的最大值,但这里显然很难完成。于是ctj。
tj表示,很容易想到要分类讨论。想到的原因是一个区域内的最大的 \(k*k\) 易得。所以可以预处理出可能需要的块来拼出三块区域。总共分了6类:

分类讨论

然后预处理出这些块,最后枚举一下就好了。说实话,好恶心。

code

#include <bits/stdc++.h>
// #define int long long
using namespace std;
constexpr int maxn = 1.5e3+10;
constexpr int maxm = 1e5+10;
constexpr int INF = 0x3f3f3f3f3f3f3f3f;
bool Mst;int n,m,k,ans;
int mat[maxn][maxn],sum[maxn][maxn];
int lu[maxn][maxn],ld[maxn][maxn];
int ru[maxn][maxn],rd[maxn][maxn];
int col[maxn][maxn],row[maxn][maxn];int get_sum(int x1,int y1,int x2,int y2)
{return sum[x2][y2]+sum[x1-1][y1-1]-sum[x1-1][y2]-sum[x2][y1-1];
}void init()
{for(int i=k;i<=n;++i){for(int j=k;j<=m;++j){lu[i][j]=max({lu[i][j-1],lu[i-1][j],get_sum(i-k+1,j-k+1,i,j)});}}for(int i=k;i<=n;++i){for(int j=m-k+1;j;--j){ru[i][j]=max({ru[i][j+1],ru[i-1][j],get_sum(i-k+1,j,i,j+k-1)});}}for(int i=n-k+1;i;--i){for(int j=k;j<=m;++j){ld[i][j]=max({ld[i][j+1],ld[i+1][j],get_sum(i,j-k+1,i+k-1,j)});}}for(int i=n-k+1;i;--i){for(int j=m-k+1;j;--j){rd[i][j]=max({rd[i][j+1],rd[i+1][j],get_sum(i,j,i+k-1,j+k-1)});}}for(int i=1;i<=n-k+1;++i){for(int j=1;j<=m-k+1;++j){row[i][i+k-1]=max(row[i][i+k-1],get_sum(i,j,i+k-1,j+k-1));}}for(int len=k+1;len<=n;++len){for(int i=1,j=i+len-1; j<=n ;++i,++j){row[i][j]=max(row[i][j-1],row[i+1][j]);}}for(int i=1;i<=m-k+1;++i){for(int j=1;j<=n-k+1;++j){col[i][i+k-1]=max(col[i][i+k-1],get_sum(j,i,j+k-1,i+k-1));}}for(int len=k+1;len<=m;++len){for(int i=1,j=i+len-1; j<=m ;++i,++j){col[i][j]=max(col[i][j-1],col[i+1][j]);}}
}bool Med;
signed main()
{#ifndef ONLINE_JUDGEfreopen("cjdl.in","r",stdin);freopen("cjdl.out","w",stdout);#endif // ONLINE_JUDGEcerr<<1.0*(&Med-&Mst)/1024/1024<<" M\n";scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){scanf("%d",&mat[i][j]);sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mat[i][j];}}init();int ans=0;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){ans=max(ans,row[i+1][n]+lu[i][j]+ru[i][j+1]);ans=max(ans,row[1][i]+ld[i+1][j]+rd[i+1][j+1]);ans=max(ans,col[j+1][m]+lu[i][j]+ld[i+1][j]);ans=max(ans,col[1][j]+ru[i][j+1]+rd[i+1][j+1]);}}for(int i=1;i<=n;++i){for(int j=i+1;j<=n;++j){ans=max(ans,row[1][i]+row[i+1][j]+row[j+1][n]);}}for(int i=1;i<=m;++i){for(int j=i+1;j<=m;++j){ans=max(ans,col[1][i]+col[i+1][j]+col[j+1][m]);}}printf("%d",ans);return 0;
}
http://www.jsqmd.com/news/36637/

相关文章:

  • 12345A 景区 区别
  • 2025年贴标机生产厂家前十强权威排名:彩航包装领跑行业
  • FastApi Linux 部署
  • 方格染色-并查集
  • 逆向基础--数据传输指令mov和xchg (10)
  • P8186-传递闭包
  • MCU电路为什么要使用复位芯片?
  • 幂塔问题-扩展欧拉函数
  • P3623 免费道路 - Kruskal
  • 2025年11月安徽合肥正规的除甲醛平台推荐排行榜单
  • 2025年11月安徽合肥除甲醛服务商推荐排行榜前十名
  • 手持贴标机生产源头厂家2025年市场洞察
  • 2025年市场上水果打标枪生产厂家排名前十:陕西彩航包装领跑行业
  • 2025年水果打标枪生产厂家Top10排名:彩航包装装潢有限公司领跑行业
  • 关于在CASS软件中导入SHP文件时出现文字乱码问题的解决方案
  • 关押罪犯P1525:并查集
  • 奶牛抗议-二维偏序优化
  • 4G摄像机国标GB28181接入EasyGBS突然不上线?双网卡智能切换惹的锅!
  • CF2117G 并查集
  • gitlab项目下载地址ip显示字符串问题
  • python中MySQL(pymsql)的使用基础
  • 水箱液位pid控制仿真,综合一阶滞后对象+阀门流量特性+不同厂家pid算法
  • DeepSeek大模型应用与实践 掌握的知识内容
  • 2025年山东视保姆公司综合实力榜单:视保姆眼镜公司/视保姆3V疗法/视保姆镜架源头企业精选
  • AI大模型高级应用 掌握的知识内容
  • 会议中心-贪心/dp
  • 安卓app自动化操作方案实现
  • 详细介绍:热门编程语言的排名及开源贡献比例表格-截至2025年10月
  • 二进制题
  • 人工智能工程技术,掌握的知识内容