nyoj 104-最大和
阿新 • • 發佈:2018-12-12
題目描述:
給定一個由整陣列成二維矩陣(r*c),現在需要找出它的一個子矩陣,使得這個子矩陣內的所有元素之和最大,並把這個子矩陣稱為最大子矩陣。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩陣為:
9 2
-4 1
-1 8
其元素總和為15。
輸入描述:
第一行輸入一個整數n(0<n<=100),表示有n組測試資料; 每組測試資料: 第一行有兩個的整數r,c(0<r,c<=100),r、c分別代表矩陣的行和列; 隨後有r行,每行有c個整數;
輸出描述:
輸出矩陣的最大子矩陣的元素之和。
樣例輸入:
複製
1 4 4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
樣例輸出:
15
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=105; int n; int r,c; int Map[maxn][maxn]; int ans; int Max; void init() { ans=Max=0; for (int i=0;i<=c;i++) Map[0][i]=0; } int main() { scanf("%d",&n); while (n--) { scanf("%d%d",&r,&c); init(); for (int i=1;i<=r;i++) { for (int j=1;j<=c;j++) { scanf("%d",&Map[i][j]); Map[i][j]+=Map[i-1][j]; } } ans=Map[1][1]; for (int i=0;i<=r;i++) { for (int j=i+1;j<=r;j++) { Max=0; for (int k=1;k<=c;k++) { int temp=Map[j][k]-Map[i][k]; if(Max>=0) Max+=temp; else Max=temp; ans=max(ans,Max); } } } printf("%d\n",ans); } return 0; }