1. 程式人生 > >返回一個二維整數陣列中最大子陣列的和

返回一個二維整數陣列中最大子陣列的和

 要求:

1,輸入一個二維整形陣列,數組裡有正數也有負數。

2,二維陣列中連續的一個子矩陣組成一個子陣列,每個子陣列都有一個和,

3,求所有子陣列的和的最大值。

設計思路:

參照一維整數陣列求解最大子陣列的方法,我們想著將二維陣列通過行不同,列相加的方法轉化為一維整數陣列再求解最大子陣列之和。

具體實現:先求出每一行的最大子陣列之和,之後比較得出最大和MaxSum,然後通過上述方法求二行的最大子陣列之和並與MaxSum比較,用MaxSum存放較大值。以此類推,求三行,四行。。。

最後實現最大子陣列的輸出及其和的輸出。

合作過程:

兩人合作探討設計思路;

一人負責分析程式,編寫程式碼;

另一人負責程式碼複審和程式碼測試。

主要程式碼:

 1   //二維整數陣列最大子陣列之和
 2   #include <iostream>
 3   #include <stdlib.h>
 4   #include <time.h>
 5   using namespace std;
 6 
 7   int main()
 8   {
 9      int M,N;
10      cout << "輸入二維陣列的行數和列數:" << endl;
11      cin >> M >> N;
12
int data[M][N],line[N],sum = 0,d1 = 0; 13 int MaxSum ,Maxd1,end1[M][N] = {0},end2[M][N] = {0}; 14 int i_max = 0,j_max = 0; 15 srand((unsigned int)time(0)); //保證生成不同的隨機數 16 cout << "二維陣列為:" << endl; 17 for (int j = 0;j < M;j++) //給二維陣列的元素賦值並輸出,取值範圍是-25到25 18 {
19 for (int k = 0;k < N;k++) 20 { 21 data[j][k] = rand()%50 - 25; 22 cout << data[j][k] << '\t'; 23 } 24 cout << endl; 25 } 26 cout << endl; 27 28 MaxSum = data[0][0]; //初值賦值為陣列第一行第一個元素 29 Maxd1 = data[0][0]; 30 for (int i = 0;i < M;i++) 31 { 32 for (int i1 = 0;i1 < M-i;i1++)//當1行是迴圈M次 33 { 34 for (int j = 0;j < N;j++)//賦初值 35 { 36 line[j] = 0; 37 } 38 for (int i2 = i1;i2 <= i1+i;i2++)//每次迴圈i次賦值 39 { 40 for (int j = 0;j < N;j++) 41 { 42 line[j] += data[i2][j]; 43 } 44 } 45 sum = 0; 46 for (int k = 0;k < N;k++) 47 { 48 sum += line[k]; 49 if (sum > MaxSum) 50 { 51 MaxSum = sum; 52 end1[i][i1] = k; 53 i_max = i; //最大的時候是i行; 54 j_max = i1; 55 } 56 if(sum < 0) 57 { 58 sum = 0; 59 } 60 } 61 62 for (int k = N-1;k >= 0;k--) 63 { 64 d1 += line[k]; 65 if (d1 > Maxd1) 66 { 67 Maxd1 = d1; 68 end2[i][i1] = k; 69 } 70 if(d1 < 0) 71 { 72 d1 = 0; 73 } 74 } 75 76 } 77 } 78 cout << "最大子陣列為:" << endl; 79 for (int k = 0;k <= i_max;k++)//輸出最大子陣列元素 80 { 81 for (int k1 = end2[i_max][j_max];k1 <= end1[i_max][j_max];k1++) 82 { 83 cout << data[j_max+k][k1] << '\t'; 84 } 85 cout << endl; 86 } 87 88 cout << endl; 89 cout << "最大子陣列的和為: " << MaxSum << endl; 90 }

執行截圖:

 

 

 

遇到的問題及解決方法:

 

日期

編號

型別

引入階段

排除階段

修復時間

修復缺陷

10.20

 1

 迴圈函式錯誤

 設計階段

編碼

 40min

 查詢資料,完善設計思路

描述:對如何實現最大子陣列的查詢思路不明確,查詢並借閱相關資料,完善設計思路

10.20

 2

 函式錯誤

 編碼

 編譯

 30min

 反覆除錯,查詢資料

 描述:對函式編寫不熟悉,bug太多,反覆編譯並查詢錯誤

 

 

體會:

對如何查詢二維整數陣列最大子陣列的和有了深刻的理解,對迴圈函式的使用也更加熟悉,但是,由於程式設計能力有限,無法解決演算法時間複雜度的問題。上述程式設計的時間複雜度為O(n^3),不能達到時間複雜度為O(n)

的目標。

 

 

合作圖片:

組內成員:張素穎,於芳娜