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

求二維整型陣列的所有子陣列的和的最大子陣列

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

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

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 }

測試截圖:

 

小組成員: