題目:返回乙個整數陣列中最大子陣列的和。
要求:輸入乙個整形陣列,陣列裡有正數也有負數。
陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。
求所有子陣列的和的最大值。要求時間複雜度為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...
軟體工程課堂訓練 結對開發之環狀二維陣列
一 題目及要求 題目 返回乙個整數陣列中最大子陣列的和 要求 新加 輸入乙個二維整形陣列,陣列裡有正數也有負數 二維陣列首尾相接,像一條首尾相接的帶子一樣。結對人員 胡亞寶 焦燕 二 設計思路 這個題目其實就是二維陣列和環型陣列的結合,要解決這個問題,將之前的兩個問題融合一下即可。首先解決求出二維陣...