DestinHistoire

 

POJ-1050 To the Max(dp)

题目描述

  求 \(n\) 行 \(n\) 列矩阵的最大子矩阵(\(1\leq n\leq 100,-127\leq a_{ij}\leq 127\))。

分析

  经典题。

  预处理每行的前缀和,然后枚举每行的起点 \(i\) 和终点 \(j\),最内层枚举行号 \(k\),更新答案即可,时间复杂度 \(O(n^3)\)。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int a[110][110],sum[110][110];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>a[i][j];
            sum[i][j]=sum[i][j-1]+a[i][j];
        }
    }
    int ans=-INF;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j++)
        {
            int temp=0;
            for(int k=1;k<=n;k++)
            {
                if(temp<0)   temp=0;
                temp=temp+sum[k][j]-sum[k][i-1];
                ans=max(ans,temp);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

posted on 2020-11-06 19:36  DestinHistoire  阅读(80)  评论(0)    收藏  举报

导航