1. 程式人生 > >求二維整型數組的所有子數組的和的最大子數組

求二維整型數組的所有子數組的和的最大子數組

沒有 using 個數 測試 str 最後一個元素 name new 們的

//註:本次小隊成員為:王友軍,白宇乾,黃瑞玻;原因與上一次相同,請見諒。

本次作業是關於二維整型數組的最大子數組的求解,相比第一次的一維數組來說,確實難了些。經過我們的苦思冥想,想了很多設計思路,但是都是存在著很多問題;在沒有別的好的方法選擇之後,我們只能選擇了最基本的:枚舉法進行求解。設計思路:

1.確定二維數組的所有子數組的數量,並用一個一維整型數組sum[]存儲;

2.從第一個元素開始,以第一個元素為子數組的起始元素,將整個數組遍歷,每得到一個二維子數組,就存儲到sum[]中;然後以第二個元素為開始;依此類推,直到最後一個元素結束。

3.然後求出sum[]數組中的最大元素,則該元素就是最大的子數組和。

程序代碼:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int m,n;
 7     cout << "請輸入二維數組的行和列:";
 8     cin >> n>> m;
 9     //定義一個可變長二維數組;
10     int** a;
11     a = new int*[n];
12     for (int i = 0; i <= n; i++)
13     {
14         a[i] = new int
[m]; 15 } 16 //定義一個存儲二維數組所有子數組的可變長一維數組; 17 int *sum=new int [m*(m+1)*n*(n+1)/4]; 18 for (int i = 0; i < m*(m + 1)*n*(n + 1) / 4; i++) 19 { 20 sum[i] = 0; 21 } 22 int t = 0; 23 cout << "輸入數組的值:" << endl; 24 for (int i = 0; i < n; i++) 25 { 26 for
(int j = 0; j < m; j++) 27 { 28 cin >> a[i][j]; 29 } 30 } 31 //用枚舉法將所有子數組的和求出,放到sum數組裏; 32 for (int i = 0; i < n; i++) 33 { 34 for (int j = 0; j < m; j++) 35 { 36 for (int p = i; p < n; p++) 37 { 38 for (int q = j; q < m; q++) 39 { 40 for (int y = i; y <= p; y++) 41 { 42 for (int x = j; x <= q; x++) 43 { 44 //求子數組和; 45 sum[t] = sum[t] + a[y][x]; 46 } 47 } 48 t++; 49 } 50 } 51 } 52 } 53 //求最大子數組; 54 for (int i = 0; i < m*(m + 1)*n*(n + 1) / 4; i++) 55 { 56 if (sum[0] < sum[i]) 57 { 58 sum[0] = sum[i]; 59 } 60 } 61 cout<< "最大子數組的和為:"<<sum[0] << endl; 62 system("pause"); 63 return 0; 64 }

測試截圖:

技術分享圖片

技術分享圖片

技術分享圖片

小組成員:

技術分享圖片

技術分享圖片

求二維整型數組的所有子數組的和的最大子數組