1. 程式人生 > 其它 >最大子矩陣-貪心

最大子矩陣-貪心

求一個矩陣的最大子矩陣(最大子矩陣的值規定為矩陣中所有的元素之和)

思路是字首和把每一行相加,通過作差得到不同行數的 相鄰行 之和,再通過求最大子串求出最大子矩陣

總時間限制: 1000ms 記憶體限制: 65536kB
描述
已知矩陣的大小定義為矩陣中所有元素的和。給定一個矩陣,你的任務是找到最大的非空(大小至少是1 * 1)子矩陣。

比如,如下4 * 4的矩陣

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的矩陣。輸入的第一行給出N (0 < N <= 100
)。再後面的若干行中,依次(首先從左到右給出第一行的N個整數,再從左到右給出第二行的N個整數……)給出矩陣中的N2個整數,整數之間由空白字元分隔(空格或者空行)。已知矩陣中整數的範圍都在[-127, 127]。 輸出 輸出最大子矩陣的大小。 樣例輸入 4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 樣例輸出 15

程式碼

#include<stdio.h>
#include<string.h>
// 題目http://noi.openjudge.cn/ch0406/1768/
int main(){
    int a[105][105],b[105][105
],n,max='\0'; //a是原有矩陣,b的第二行是第一行和第二行的和,第三行是第一、二、三行的和,以此類推 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%d",&n); for(int i=1;i<=n;i++){//a、b賦值 for(int j=1;j<=n;j++){ scanf("%d",&a[i][j]); if(max=='\0') max=a[i][j];//防止矩陣全為負數 b[i][j]=a[i][j]+b[i-1
][j]; } } for(int i=1;i<=n;i++){//從第i行開始遍歷i行到n行的矩陣和 for(int j=i;j<=n;j++){//每次遍歷從i行開始 int tem=0; for(int k=1;k<=n;k++){//i到j行相加後的數值串求最大子串即為最大矩陣和 if(tem<0) tem=b[j][k]-b[i-1][k]; else tem+=b[j][k]-b[i-1][k]; if(tem>max) max=tem; } } } printf("%d",max); return 0; } /* 測試資料 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 結果 15 */