【動態規劃】最大子矩陣之和
阿新 • • 發佈:2018-12-13
最大子矩陣之和
題目描述
已知矩陣的大小定義為矩陣中所有元素的和。給定一個矩陣,你的任務是找到最大的非空(大小至少是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;
}