求二維整型陣列的所有子陣列的和的最大子陣列
本次作業是關於二維整型陣列的最大子陣列的求解,相比第一次的一維陣列來說,確實難了些。經過我們的苦思冥想,想了很多設計思路,但是都是存在著很多問題;在沒有別的好的方法選擇之後,我們只能選擇了最基本的:列舉法進行求解。設計思路:
1.確定二維陣列的所有子陣列的數量,並用一個一維整型陣列sum[]儲存;
2.從第一個元素開始,以第一個元素為子陣列的起始元素,將整個陣列遍歷,每得到一個二維子陣列,就儲存到sum[]中;然後以第二個元素為開始;依此類推,直到最後一個元素結束。
3.然後求出sum[]陣列中的最大元素,則該元素就是最大的子陣列和。
程式程式碼:
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6int m,n; 7cout << "請輸入二維陣列的行和列:"; 8cin >> n>> m; 9//定義一個可變長二維陣列; 10int** a; 11a = new int*[n]; 12for (int i = 0; i <= n; i++) 13{ 14a[i] = new int[m]; 15} 16//定義一個儲存二維陣列所有子陣列的可變長一維陣列; 17int *sum=new int [m*(m+1)*n*(n+1)/4]; 18for (int i = 0; i < m*(m + 1)*n*(n + 1) / 4; i++) 19{ 20sum[i] = 0; 21} 22int t = 0; 23cout << "輸入陣列的值:" << endl; 24for (int i = 0; i < n; i++) 25{ 26for (int j = 0; j < m; j++) 27{ 28cin >> a[i][j]; 29} 30} 31//用列舉法將所有子陣列的和求出,放到sum數組裡; 32for (int i = 0; i < n; i++) 33{ 34for (int j = 0; j < m; j++) 35{ 36for (int p = i; p < n; p++) 37{ 38for (int q = j; q < m; q++) 39{ 40for (int y = i; y <= p; y++) 41{ 42for (int x = j; x <= q; x++) 43{ 44//求子陣列和; 45sum[t] = sum[t] + a[y][x]; 46} 47} 48t++; 49} 50} 51} 52} 53//求最大子陣列; 54for (int i = 0; i < m*(m + 1)*n*(n + 1) / 4; i++) 55{ 56if (sum[0] < sum[i]) 57{ 58sum[0] = sum[i]; 59} 60} 61cout<< "最大子陣列的和為:"<<sum[0] << endl; 62system("pause"); 63return 0; 64 }
測試截圖:
小組成員: