最大子矩陣 NYOJ104

2021-06-23 01:28:23 字數 1003 閱讀 5903

給定乙個由整數組成二維矩陣(r*c),現在需要找出它的乙個子矩陣,使得這個子矩陣內的所有元素之和最大,並把這個子矩陣稱為最大子矩陣。

這個問題就是最大值子區間和的二維問題。

一維問題的解決思路是,max_sum表示從第一數到目前的最大和,sum是某段區間的和,如果sum<0,那麼sum沒有利用價值了,把sum=0,否則就繼續往上加。

max_sum=max((sum+=a[i])<0?0:

sum,max_sum);

二維的問題,其實可以轉化為一位的問題。

首先我們要注意到二維子矩陣在選取的時候是個矩陣,聯絡乙個我們經常會用到的技巧:但我們需要頻繁計算乙個資料任意乙個區間

的和的時候,我們會預先把這個陣列使用啊a[i]=a[i]+a[i-1]的方式把它記錄的值變為陣列到這個位置的和,這樣的好處就是任意乙個區間[i,j]的和就可轉化為了a[i]-a[j-1]。

在這裡我們依然採用這樣的技巧。我們把這個矩陣記錄的值對於每個列向量都做上述改變。

然後我們就發現,但我們選取任意的連續行進行組合的時候,這個行區間對於的列的值的和都可以用上述方法快速獲得,那麼對於每個列的和又會變為乙個求一維連續區間最大和問題了。到此這個問題就可以以o(n^2)的複雜度解決了。

**如下:

[html]view plain

copy

#include <

stdio.h

>

#include <

string.h

>

int map[102][102];  

int main()  

}  for(i=1

,m=map

[1][0];i

<

=r;i++)  

for(j=i

;j<

=r;j++)  

}  printf("%d\n",m);  

memset(map,0,sizeof(map));  

}  }  

NYOJ 104 最大子矩陣和

此 在全為 2時,輸出0,顯然錯誤,因為函式下標從0開始,而傳遞的引數希望他從1開始 include include int a 101 101 b 10010 int subsequencesum int a,int n return maxsum int main max subsequence...

NYOJ104 最大和(dp 求最大子矩陣)

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 給定乙個由整數組成二維矩陣 r c 現在需要找出它的乙個子矩陣,使得這個子矩陣內的所有元素之和最大,並把這個子矩陣稱為最大子矩陣。例子 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩陣為 9 2 4 ...

NYOJ 104 最大子矩陣(二維DP)

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描寫敘述 給定乙個由整數組成二維矩陣 r c 如今須要找出它的乙個子矩陣,使得這個子矩陣內的全部元素之和最大,並把這個子矩陣稱為最大子矩陣。樣例 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩陣為 9 2 ...