1. 程式人生 > 實用技巧 >POJ-1050 To the Max(dp)

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;
}