二維情況下,定義「部分和」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_max]-ps[i_max][j_min-1]+ps[i_min-1][j_min-1]。(可以想象)。對於求解部分和,也能以o(1)時間得到新的部分和,ps[i][j]=ps[i-1][j]+ps[i][j-1]-ps[i-1][j-1]+b[i][j],其中b[i][j]為矩陣中第i行第j列的元素(下標從1開始)。因此用o(n*m)時間複雜度可以處理所有部分和。故演算法總時間複雜度為o(n*n*m*m)。
進一步解法:列舉矩形上下邊界(左右也可以),然後用一維情況下的方法確定左右邊界,就可以得到二維問題的解(將bc(a,c,i)看成是一維裡的乙個元素)。新方法時間複雜度為o(n*n*m)。bc(a,c,i),表示在第a行和第c行之間的第i列的所有元素的和,顯然可以通過「部分和」在o(1)時間內計算出來,它等於ps[c][i]-ps[a-1][i]-ps[c][i-1]+ps[a-1][i-1]。(這些ps在前面的計算中以及獲得)
通過選擇列舉上下或左右可以使時間複雜度變為o(n*m*min(n,m))。
子陣列之和的最大值 二維
程式設計之美 第2.15節 子陣列之和的最大值 二維 題目 求二維陣列中子陣列的最大和 解法 從上到下遍歷,對於第i行,遍歷從第i行往下的所有行,使其加和成為一維陣列,然後用一維陣列求最大值來做。include includeusing namespace std int sub2darrysum ...
求子陣列之和的最大值(二維)
求子陣列之和的最大值 二維 public class subbinaarraysum if start max start 0 return max low和high為將二維陣列劈開的兩列,取值範圍為0 m,line為二維陣列的哪一行 函式返回兩列之間的一維陣列的和 public static in...
程式設計之美 子陣列之和的最大值(二維)
避免使用暴力列舉的方法,我們參考一維陣列的求法,一維的解答可以再線性時間 內完成,具體可以參考我的程式設計珠璣讀書筆記。我們把問題從二維轉壞為一維,現在我們列舉矩陣的上下邊界,然後用一維的方法確定左右邊界,時間複雜度為o n 2 m include include using namespace s...