程式設計之美 子陣列之和的最大值(二維)

2021-06-17 16:35:33 字數 856 閱讀 7627

避免使用暴力列舉的方法,我們參考一維陣列的求法,一維的解答可以再線性時間 內完成,具體可以參考我的程式設計珠璣讀書筆記。

我們把問題從二維轉壞為一維,現在我們列舉矩陣的上下邊界,然後用一維的方法確定左右邊界,時間複雜度為o(n^2*m)。

#include #include using namespace std;

const int maxn=505;

int matrix[maxn][maxn];

int ps[maxn][maxn]; //部分和

int maxnum=-0xfffff;

int mmax(int a,int b)

int bc(int row,int col,int m) //第row行到第col行之間的第m列所有元素之和

int maxsum(int matrix[maxn][maxn],int n,int m)

if(maxsofar>maxnum)maxnum=maxsofar;

} return maxnum;

}int main()

{ int n,m;

cin>>n>>m;

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

cin>>matrix[i][j];

memset(ps,0,sizeof(ps));

for(int i=1;i<=n;i++) //部分和預處理矩陣,便於在o(1)的時間內得到bc()

for(int j=1;j<=m;j++)

ps[i][j]=ps[i-1][j]+ps[i][j-1]-ps[i-1][j-1]+matrix[i][j];

cout<

程式設計之美 2 15 子陣列之和的最大值(二維)

給乙個二維陣列,求子陣列的和的最大值,也就是求子矩陣的最大和。這道題的解題思路與2.14求陣列的子陣列之和的最大值有類似之處,具體步驟如下 設原陣列為a,行數為row,列數為column.1.先求矩陣p row 1,column 1 p i,j 表示在a中以a i 1,j 1 到a 0,0 為對角線...

程式設計之美 2 15 子陣列之和的最大值(二維)

思路,有了一維的思路,我們想辦法把二維問題轉化為一維的問題。我們假定已經選中了行的範圍是 a c 那麼把每一列中 a c的元素加起來就變成了乙個一維的問題。只需對行的範圍遍歷,再用一維的方法來解就可以了。注意,也可以對列的範圍遍歷,行和列那個小就對哪個遍歷。複雜度為o m n min m,n inc...

子陣列之和的最大值(二維)

二維情況下,定義 部分和 ps i j 等於以 1,1 i,1 1,j i,j 為頂點的矩形區域的元素之和。則以 i min,j min i min,j max i max,j min i max,j max 為頂點的矩形區域的元素之和,等於ps i max j max ps i min 1 j m...