1. 程式人生 > >【DP】最大子矩陣之和

【DP】最大子矩陣之和

題目

給出一個N [2<=N<=100],並給出一個N*N的矩陣,矩陣中的數為[-127,127]之間。求出矩陣中一塊子矩陣的最大和。

輸入樣例

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

輸出樣例

15

解題思路

每讀入一個數,就求出它那列的字首和,最後直接利用字首和進行計運算元矩陣和(其實就是最大連續數列的和),時間複雜度是O(n^3)。

程式碼

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[101][101],n; int main() { memset(a,0,sizeof(a)); scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) { int l; scanf("%d",&l); a[i][j]=a[i-1][j]+l;//求一列的字首和 } int maxn=-2147483647; for (int i=1;i<=n;i++) for (int j=i;j<=n;j++)//以防出現j<i,若j<i,下面算式求不了
{ int t=0; for (int k=1;k<=n;k++) { t+=a[j][k]-a[i-1][k];//求一個子矩陣的和 maxn=max(maxn,t);//求最大的子矩陣和 t=max(t,0); } } printf("%d",maxn); return 0; }