1. 程式人生 > >代碼題(35)— 最大和子矩陣

代碼題(35)— 最大和子矩陣

每一個 我們 span 又是 bar emp 擁有 部分 。。

1、最大和子矩陣

問題:
求一個M*N的矩陣的最大子矩陣和。
比如在如下這個矩陣中:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
擁有最大和的子矩陣為:
9 2
-4 1
-1 8
其和為15。

  假定原始矩陣的行數為M,那麽對於子矩陣,它的行數可以是1到M的任何一個數,而且,對於一個K行(K < M)的子矩陣,它的第一行可以是原始矩陣的第1行到 M - K + 1 的任意一行。同時對於每一個得到的子矩陣,假設這個子矩陣是 2 *k, 也就是說它只有兩行,要找出最大子矩陣,我們要從左到右不斷的遍歷才能找出在這種情況下的最大子矩陣。如果我們把這兩行上下相加,情況就和求“最大子段和問題” 又是一樣的了。

  為了找出在原始矩陣裏的最大子矩陣,我們要遍歷所有的子矩陣的可能情況,也就是說,我們要考慮這個子矩陣有可能只有1行,2行,。。。到n行。而在每一種情況下,我們都要把它所對應的矩陣部分上下相加才求最大子矩陣(局部)。

class SubMatrix {
public:
    int sumOfSubMatrix(vector<vector<int> > mat, int n) {
        // write code here
        if(mat.empty() || n<=0)
            return 0;
        int maxsum = 0
; for(int i=0;i<n;++i) { vector<int> temp(mat[i]); maxsum = max(maxsum, subArray(temp)); for(int j=i+1;j<n;++j) { for(int k=0;k<n;++k) { temp[k] = temp[k] + mat[j][k]; } maxsum
= max(maxsum, subArray(temp)); } } return maxsum; } // 一維數組最大自序和 int subArray(vector<int> &temp) { int sum = temp[0]; int maxsum = temp[0]; for(int i=1;i<temp.size();++i) { if( sum>=0) sum += temp[i]; else sum = temp[i]; maxsum = max(maxsum, sum); } return maxsum; } };

代碼題(35)— 最大和子矩陣