求二維整型數組的所有子數組的和的最大子數組
阿新 • • 發佈:2018-10-21
沒有 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 }
測試截圖:
小組成員:
求二維整型數組的所有子數組的和的最大子數組