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

返回一個二維整數數組最大子數組的和

std cin 有一個 二維 返回 循環函數 col 體會 解決方法

要求:

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

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

3,求所有子數組的和的最大值。

設計思路:

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

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

最後實現最大子數組的輸出及其和的輸出。

合作過程:

兩人合作探討設計思路;

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

另一人負責代碼復審和代碼測試。

主要代碼:

 //二維整數數組最大子數組之和
  #include <iostream>
  #include <stdlib.h>
  #include <time.h>
  using namespace std;

  int main()
  {
     int M,N;
     cout << "輸入二維數組的行數和列數:" << endl;
     cin >> M >> N;
     int data[M][N],line[N],sum = 0,d1 = 0;
     int MaxSum ,Maxd1,end1[M][N] = {0
},end2[M][N] = {0}; int i_max = 0,j_max = 0; srand((unsigned int)time(0)); //保證生成不同的隨機數 cout << "二維數組為:" << endl; for (int j = 0;j < M;j++) //給二維數組的元素賦值並輸出,取值範圍是-25到25 { for (int k = 0;k < N;k++) { data[j][k] = rand()%50 - 25; cout
<< data[j][k] << \t; } cout << endl; } cout << endl; MaxSum = data[0][0]; //初值賦值為數組第一行第一個元素 Maxd1 = data[0][0]; for (int i = 0;i < M;i++) { for (int i1 = 0;i1 < M-i;i1++)//當1行是循環M次 { for (int j = 0;j < N;j++)//賦初值 { line[j] = 0; } for (int i2 = i1;i2 <= i1+i;i2++)//每次循環i次賦值 { for (int j = 0;j < N;j++) { line[j] += data[i2][j]; } } sum = 0; for (int k = 0;k < N;k++) { sum += line[k]; if (sum > MaxSum) { MaxSum = sum; end1[i][i1] = k; i_max = i; //最大的時候是i行; j_max = i1; } if(sum < 0) { sum = 0; } } for (int k = N-1;k >= 0;k--) { d1 += line[k]; if (d1 > Maxd1) { Maxd1 = d1; end2[i][i1] = k; } if(d1 < 0) { d1 = 0; } } } } cout << "最大子數組為:" << endl; for (int k = 0;k <= i_max;k++)//輸出最大子數組元素 { for (int k1 = end2[i_max][j_max];k1 <= end1[i_max][j_max];k1++) { cout << data[j_max+k][k1] << \t; } cout << endl; } cout << endl; cout << "最大子數組的和為: " << MaxSum << endl; }

技術分享圖片

技術分享圖片

遇到的問題及解決方法:

日期

編號

類型

引入階段

排除階段

修復時間

修復缺陷

10.20

1

循環函數錯誤

設計階段

編碼

40min

查找資料,完善設計思路

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

10.20

2

函數錯誤

編碼

編譯

30min

反復調試,查找資料

描述:對函數編寫不熟悉,bug太多,反復編譯並查找錯誤

體會:

對如何查找二維整數數組最大子數組的和有了深刻的理解,對循環函數的使用也更加熟悉,但是,由於編程能力有限,無法解決算法時間復雜度的問題。上述編程的時間復雜度為O(n^3),不能達到時間復雜度為O(n)

的目標。

合作圖片:

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

技術分享圖片

返回一個二維整數數組最大子數組的和