(仅用于记录个人思路)
题目:给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。
输入:输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。
输出:对于每组数据,输出一个整数,表示子矩阵的最大和。
SI:
1
4 5 2 2
3 361 649 676 588
992 762 156 993 169
662 34 638 89 543
525 165 254 809 280
SO:
2474
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int m,n,x,y,s=0,t,a[1005][1005];
int main()
{
cin>>t;
while(t--)
{
cin>>m>>n>>x>>y;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
cin>>a[i][j];//输入数据
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
a[i][j]=a[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1];//计算出从最左上方到这个点的数据的和
/*
比如
1 2 3
1 2 3
1 2 3
就是
1 3 6
2 6 12
3 9 18
*/
}
for(int i=x;i<=m;i++)
{
for(int j=y;j<=n;j++)
{
s=max(s,a[i][j]-a[i-x][j]-a[i][j-y]+a[i-x][j-y]);//求出每个所需矩阵和然后求最大值
}
}
/*
比如还是上面那组矩阵
我想求一个2*2的矩阵最大值
思路类似于容斥原理
第一个矩阵因为是从左上角直接开始的,所以直接计算
第二个矩阵2 3换行2 3可认为是
0 0 0
1 2 3
1 2 3
第三个矩阵1 2换行1 2可认为是
0 1 2
0 1 2
0 1 2
第四个矩阵即原矩阵
即计算18-1-1-1-2-3(从大的九宫格中挖出小的四宫格)
即计算18-3-6+1,因为1的那个格被多减掉了一次所以加回来算出这个四宫格的大小
最后将几个数据max求出最大值即为答案
*/
cout<<s<<endl;
}
return 0;
}
来源:CSDN
作者:Cool_Maple
链接:https://blog.csdn.net/Cool_Maple/article/details/104074911