1. 程式人生 > >返回一個二維整數陣列中最大子陣列的和(二人結對)

返回一個二維整數陣列中最大子陣列的和(二人結對)

題目:返回一個二維整數陣列中最大子陣列的和

要求:1.輸入一個二維整型陣列,數組裡有正數也有負數。

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

           3.求所有子陣列的和的最大值。

 

設計思想: 二維陣列求最大子陣列可以簡化成多個一維陣列比較求最大 。

       1.首先在使用者輸入行數列數以及相應二維陣列後,即確定了陣列列數的最大上界,從第一列開始確定最大子陣列範圍。

       2.對於規定好的最大子陣列的範圍,把陣列分成幾組有不同的列的陣列(如第一組只有一列,第二組有兩列等,而行數則和原陣列的行數相同)。

       3.對於以上產生的幾個陣列,用一維陣列求子陣列之和最大值的方法,依次求出最大值,比較,保留最大的。

       4.然後從最大上界依次減小,重複以上步驟。

 

原始碼為:

 1 #include<iostream>
 2 #include<stdlib.h>
 3
using namespace std; 4 5 void main () 6 { 7 int x,y,i,j,m=0; 8 cout<<"Please enter the number of rows for an array:"; 9 cin>>x; 10 cout<<"Please enter the number of columns in the array:"; 11 cin>>y; 12 int *A = new int[x*y]; 13 cout<<"
Enter the array:"<<endl; 14 for(i=0;i<x;i++) 15 { 16 for(j=0;j<y;j++) 17 { 18 cin>>A[i*y+j]; //表示第i行第j列元素(注意i乘的是列數) 19 } 20 } 21 int sum[100]={0},MaxSum=A[0]; 22 //以列為基準進行迴圈(即先豎著加) 23 for(j=0;j<y;j++) //確定子陣列的列數(用輸入的y確定) 24 { 25 for(m=0;m<y;m++) //確定子陣列有j(j不超過y-m)行 26 { 27 for(i=0;i<x;i++) 28 { 29 sum[i]=sum[i]+A[i*y+(m+j)]; 30 } 31 int max=0; //初始化定義一個值為零的max 32 for(i=0;i<x;i++) 33 { 34 if(max+sum[i]>sum[i]) 35 { 36 max=max+sum[i]; 37 } 38 else 39 { 40 max=sum[i]; 41 } 42 if(max>MaxSum) 43 { 44 MaxSum=max; 45 } 46 } 47 } 48 //初始化sum[i]的值,使子陣列最大上界下降1,之後重新迴圈。 49 for(i=0;i<x;i++) 50 { 51 sum[i]=0; 52 } 53 } 54 cout<<"The sum of the largest subarray is:"<<MaxSum<<endl; 55 system("pause"); 56 }

 

結果截圖:

               

 

總結與體會:1.最開始,為了確保求和的陣列的確是矩陣,我們嘗試了用一步一步的迴圈分別將一行矩陣,二行矩陣,三行矩陣分類相加,類內比較,再類間比較取最大的方法,但是前提是我們輸入的原二維陣列是3行3列的,這種情況下程式碼就已經很多了,而一旦陣列再有任何變化就要修改整個程式,這種方法的複雜與笨拙就顯示出來了。之後,我們在經過觀察和總結網上的例子作參考以後,寫出了以上原始碼,目前為止我們都覺得這樣的程式碼既能滿足要求又比較容易理解。

2.學習瞭如何用new定義二維陣列:

以m*n舉例:
第一種方法:
int **a = new int*[m];
for(int i=0; i < m; i++)
a[i] = new int[n];
第二種方法:
int* a = new int[m*n];
a[i*n+j]是第i行第j列元素

3.雙人結對程式設計的確可以提高效率,看來以後不僅需要提高自己的能力,更需要多多增強團隊合作意識與能力。

 

合作美圖:

                                            

                                               (   20163953  關甜歡                     20163955  王美儀  )