P7626 [COCI2011-2012#1] MATRIX( 普及/提高− ) 题解

发布时间 2023-11-27 18:32:49作者: BadBadBad__gqc

题目传送门

思路:

首先思考暴力,\(O(n^4)\) 的时间复杂度,不行。
那么我们这里就要运用到一点前缀和的知识了。
我们可以用前缀和对两条对角线进行计数。
每个点有两个对角线运算。
差不多是 \(O(n^2)\)\(O(n^3)\)的时间复杂度。
\(n\leq400\) 稳过。

Code:

#include<bits/stdc++.h>
using namespace std;
long long n,m,ans,a[5][405][405];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>a[1][i][j];
			a[2][i][j]=a[1][i][j];
			a[1][i][j]=a[1][i][j]+a[1][i-1][j-1];
			a[2][i][j]=a[2][i][j]+a[2][i-1][j+1];//前缀和 
		}
	}
	for(int k=1;k<=n;k++)
	{
		for(int i=k;i<=n;i++)
		{
			for(int j=k;j<=n;j++)
			{
				ans=max(ans,(a[1][i][j]-a[1][i-k][j-k])-(a[2][i][j-k+1]-a[2][i-k][j+1]));//求差的最大值 
			}
		}
	}
	cout<<ans;
	return 0;
}