1. 程式人生 > >【動態規劃】最大子矩陣之和

【動態規劃】最大子矩陣之和

最大子矩陣之和

題目描述

已知矩陣的大小定義為矩陣中所有元素的和。給定一個矩陣,你的任務是找到最大的非空(大小至少是11)子矩陣。 比如,如下44子矩陣 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩陣是 9 2 -4 1 -1 8 這個子矩陣的大小是15。

輸入

輸入一個N*N(1<=N<=100)的整數矩陣,每個數的範圍在-127~127之間。

輸出

輸出最大子矩陣的大小。

輸入樣例

4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2

輸出樣例

15

解題思路

先用陣列來求出每一個數的字首和,再把每一列都看做一個整體,最後再用最大連續數列來算出最大矩陣之和。

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[128][128],ans=-2147483647,b;//ans要定義一個較大的負數,
//因為輸入時也有可能是負數
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
      {
          scanf("%d",&b);
          a[i][j]=a[i-1][j]+b;//求一個數的字首和
} for(int i=1;i<=n;i++) for(int j=i;j<=n;j++)//分別列舉前、後的數 { int c=0; for(int k=1;k<=n;k++) { c+=a[j][k]-a[i-1][k];//最大連續數列 ans=max(ans,c);//選最大的最大連續數列 c=max(c,0);//要看它是否小於0,如果是小於0,就把它轉成0
} } printf("%d",ans); return 0; }