【C++ 二维前缀和】约会

题目描述

从前,小兔发现了一个神秘的花园。

花园是一个 n 行 m 列的矩阵,第 i 行 j 列的花的美丽度为 ai,j,一个合法的约会场所为任意一个正方形子矩阵,定义子矩阵的浪漫度为这个子矩阵的两条对角线上的花的美丽度之和。

现在小兔想选一个面积大等于 1 的约会场所使得场所的浪漫度最大,以便和小鹿约会,因为小兔忙着 AKIOI ,所以她把这个问题交给了你。

输入

第一行,两个正整数 n,m。

接下来是一个 n 行 m 列的矩阵,表示各个位置上花的美丽度。

输出

仅一行,一个正整数,表示最大的浪漫度。

样例输入 Copy
复制代码
3 3
2 -1 3
-4 2 1
1 2 -1
样例输出 Copy
复制代码
7
提示

对于 40%的数据,n,m≤10。

对于 100%的数据,1≤n,m≤300,∣ai∣≤104。

cpp 复制代码
#include <cstdio>
#include <climits>
int a[310][310];
long long sumz[310][310],sumf[310][310];
long long ans = LLONG_MIN;
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			scanf("%d", &a[i][j]);
			sumz[i][j] = sumz[i - 1][j - 1] + a[i][j];
			sumf[i][j] = sumf[i - 1][j + 1] + a[i][j];
		}
	}
	int b = m < n ? m : n, temp;
	for (int k = 1; k <= b; k++)
	{
		for (int i = 1; i <= n - k + 1; i++)
		{
			for (int j = 1; j <= m - k + 1; j++)
			{
				temp = sumz[i + k - 1][j + k - 1] - sumz[i - 1][j - 1] 
                     + sumf[i + k - 1][j] - sumf[i - 1][j + k];
				if(k & 1) 
                    temp -= a[((i << 1) + k - 1) >> 1][((j << 1) + k - 1) >> 1];
				if (temp > ans) ans = temp;
			}
		}
	}
	printf("%lld\n", ans);
	return 0;
}
相关推荐
香蕉卜拿拿拿5 小时前
软件解耦与扩展的利器:基于C++与C#的插件式开发实践
c++
aigcapi5 小时前
RAG 系统的黑盒测试:从算法对齐视角解析 GEO 优化的技术指标体系
大数据·人工智能·算法
苏宸啊6 小时前
链式二叉树基操代码实现&OJ题目
数据结构
风筝在晴天搁浅6 小时前
hot100 25.K个一组翻转链表
数据结构·链表
CoderCodingNo6 小时前
【GESP】C++五级真题(贪心和剪枝思想) luogu-B3930 [GESP202312 五级] 烹饪问题
开发语言·c++·剪枝
柯慕灵6 小时前
7大推荐系统/算法框架对比
算法·推荐算法
adam-liu6 小时前
Fun Audio Chat 论文+项目调研
算法·语音端到端·fun-audio-chat
小十一再加一6 小时前
【初阶数据结构】栈和队列
数据结构
栀秋6666 小时前
你会先找行还是直接拍平?两种二分策略你Pick哪个?
前端·javascript·算法
如果你想拥有什么先让自己配得上拥有7 小时前
数学思想和数学思维分别都有什么?
线性代数·算法·机器学习