軟體工程 求二維陣列所有子矩陣的和的最大值

2022-06-01 23:45:11 字數 2018 閱讀 4876

題目:返回乙個整數陣列中最大子陣列的和。

要求:輸入乙個整形陣列,陣列裡有正數也有負數。

陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。

求所有子陣列的和的最大值。要求時間複雜度為o(n)。

結對程式設計要求:

兩人結對完成程式設計任務。

一人主要負責程式分析,**程式設計。

一人負責**複審和**測試計畫。

一、設計思想

求二維陣列最大子陣列的和,可以轉化為求一維陣列最大子陣列的和

我們有乙個最初的二維陣列a[n][m],找它的 最大子陣列之和

1.我們先建立乙個新的二維陣列b[n][m],二維陣列b[j][k] 存放的是a[j][k](0<=j2.迴圈:從a[0][0]開始 以此是 a[0][1]、 a[0][2]……a[0][m]、

a[1][0]、 a[1][1]……a[1][m]、

a[2][0]、 a[2][1]……a[2][m]、

a[n][0]、 a[n][1]……a[n][m]、

具體迴圈工作:當迴圈到a[j][k](0<=j計算方法:根據b[j-1][k]、b[j][k-1]、b[j-1][k-1]的正負情況,來計算b[j][k],根據包含a[j][k]的各種矩陣情況,求得最大值。

3.求出b[m][n]中的最大值。

二、源**

1 #include2

using

namespace

std;

3int

main()4;

7int b[3][3];8

int max=a[0][0];9

for(i=0;i<3;i++)

1015 cout<

17for(i=0;i<1;i++)

1826

else

27 30}

31}32for(i=1;i<3;i++)

3340

else

4144}45

}46for(i=1;i<3;i++)

4758

else

5962}63

else

if(b[i-1][j]>=0&&b[i][j-1]<=0)64

67else

if(b[i-1][j]<=0&&b[i][j-1]>=0)68

71else

7275}76

else

7782

else

if(b[i-1][j]>=0&&b[i][j-1]<=0)83

86else

if(b[i-1][j]<=0&&b[i][j-1]>=0)87

90else

9194}95

}96}97

for(i=0;i<3;i++)

98103 cout<

104}

105for(i=0;i<3;i++)

106112

}113 cout<

max=

"114return

0;

115 }

三、執行結果截圖

有正有負:

全是正數:

全是負數:

四、心得體會

首先是設計思想,一開始我們思路比較混亂,先找到一共有多少個子矩陣,想著怎麼樣才能把整個陣列的所有子矩陣都遍歷一遍,也不知道具體怎麼樣用程式實現。

課上有同學介紹他們自己的思路,使我們確定了一條可以執行的思路。

程式的編寫具有極大挑戰性,由於是二維陣列,行列老是弄混,元素想加時情況又多,要隨時注意思路清晰。

附:

求二維矩陣和最大的子矩陣

一 題目 求二維矩陣中和最大的子矩陣。二 設計思路 將二維陣列轉化為一維陣列,在運用一維陣列求最大子陣列方法求出。c 0 a 0 c 1 a 0 a 1 依次往下。將二維陣列存到txt檔案中。三 源 1 include2 include3 void writefile int a 20 int le...

二維陣列字首和 差分 以及列舉所有矩形(子矩陣)

就變成了上面的紅色部分。那麼假設紅色部分左上角座標為 x1,y1 x1,y1 右下角為 x2,y2 x2,y2 設sum x y sum x y 表示從 1,1 1,1 加到 x,y x,y 的和,那麼紅色部分就是 sum x2 y2 sum x2 y1 1 sum x1 1 y2 sum x1 1...

軟體工程課堂訓練 結對開發之環狀二維陣列

一 題目及要求 題目 返回乙個整數陣列中最大子陣列的和 要求 新加 輸入乙個二維整形陣列,陣列裡有正數也有負數 二維陣列首尾相接,像一條首尾相接的帶子一樣。結對人員 胡亞寶 焦燕 二 設計思路 這個題目其實就是二維陣列和環型陣列的結合,要解決這個問題,將之前的兩個問題融合一下即可。首先解決求出二維陣...