最大子矩阵

你离开我真会死。 提交于 2020-01-23 16:13:00

(仅用于记录个人思路)
题目:给你一个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;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!