標籤:
一、題目要求
題目:返回一個二維整數數組中最大子數組的和。要求:輸入一個二維整形數組,數組裡有正數也有負數。二維數組首尾相接,象個一條首尾相接帶子一樣。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。求所有子數組的和的最大值。要求時間複雜度為O(n)。二、設計思路這次的題目設計思路沿用的是上次一位元組的設計思想,把二維數組中的每一行看作是一位元組,然後做出擴充,程式依然用的是二維數組的那個,在這個基礎上做出稍稍改變就行了三、原始碼
1 //程式開發人員:曹美娜 蓋相庚 2 // 開發時間:2015/3/31 3 4 #include "stdafx.h" 5 #include "fstream.h" 6 #include "iostream.h" 7 #include "stdio.h" 8 #define N 50 9 #define M 50 10 11 void readarry(int arry[][N],int &line,int &row) //讀取txt檔案中的二維數組 12 { 13 ifstream infile("a.txt"); 14 if(!infile) 15 cout<<"讀取失敗!"<<endl; 16 else 17 { 18 infile>>line>>row; 19 for(int i=0;i<line;i++) 20 { 21 for(int j=0;j<row;j++) 22 { 23 infile>>arry[i][j]; 24 } 25 } 26 } 27 } 28 29 int maxarry(int arry[][N],int line,int row) //找到二維數組中子矩陣中元素和的最大值 30 { 31 int max[N]; 32 printf("以上數組經變形後:\n"); 33 for(int l=0;l<line;l++) 34 { 35 int max1=-1000; 36 for(int j=0;j<(row+1)/2;j++) 37 { 38 int sum=0; 39 for(int i=j;i<(row+1)/2;i++) 40 { 41 sum=sum+arry[l][i]; 42 if(sum>=max1) 43 { 44 max1=sum; 45 } 46 } 47 48 } 49 max[l]=max1; 50 51 printf("第%d集合所有子數組的和的最大值為:%d\n",l+1,max1); 52 } 53 int fmax=max[0]; 54 for(int q=0;q<line;q++) 55 { 56 if(max[q]>fmax) 57 fmax=max[q]; 58 } 59 printf("所以次二位元字中子數組中各元素的和的最大值為:%d\n",fmax); 60 61 return 0; 62 } 63 64 void reacharry(int arry[][N],int line,int row) //組成一個新數組 65 { 66 int sumarry[M][N]; 67 int sumline,sumrow; 68 int z; 69 for(int r=0;r<row;r++) 70 { 71 z=0; 72 for(int i=0;i<line;i++) 73 { 74 for(int q=line;q>0;q--) 75 { 76 int sum=0; 77 for(int j=i;j<=line-q+i;j++) 78 { 79 sum=sum+arry[j][r]; 80 } 81 sumarry[z][r]=sum; 82 z++; 83 } 84 } 85 } 86 sumline=z-1; 87 sumrow=r; 88 maxarry(sumarry,sumline,sumrow); //將得到的新數組交給maxsrry(),找到最後結果 89 90 } 91 92 int expand(int arry[][N],int &line,int &row) //對二維數組進行拓展 93 { 94 int arry1[N][N]; 95 for(int i=0;i<line;i++) 96 { 97 for(int j=0;j<row;j++) 98 { 99 arry1[i][j]=arry[i][j];100 }101 }102 int num=0;103 for(i=0;i<line;i++)104 {105 for(int q=row;q<2*row-1;q++)106 {107 arry[i][q]=arry[i][num];108 num++;109 }110 }111 reacharry(arry1,line,2*row-1);112 113 return 0;114 115 }116 117 118 119 void show(int arry[][N],int line,int row) //顯示數組120 {121 printf("從“a.txt”檔案中讀取的數組為:\n");122 for(int i=0;i<line;i++)123 {124 for(int j=0;j<row;j++)125 {126 printf("\t%d\t",arry[i][j]);127 }128 printf("\n");129 }130 }131 132 133 134 135 int main(int argc, char* argv[])136 {137 int arry[M][N];138 int line,row; //行,列139 readarry(arry,line,row);140 show(arry,line,row);141 expand(arry,line,row);142 143 return 0;144 }
四、
可能由於我沒有講拓展後的數組輸出,所以讀者可能看不太出來設計思路,其實設計思路在我上幾篇部落格中都有提到,這幾個的程式設計思路都有所相同
五、心得體會
本次結對開發用時最短,因為是在上一次二維數組上做的拓展,所以思路捋起來很清晰,所以完成的也就快了,這次放假前老師說要要我們小小的放鬆一下,所以會有一下段時間不會在和我的小夥伴結對程式設計了,總結一下這幾次的結對開發的想法吧,我的小夥伴還是很給力的,只不過是比較自謙,不太信任自己的能力,有時候想東西他也是要比我快的,思維要比我更活躍,希望蓋蓋同學好好努力,不要太早的為自己蓋上標籤。
結對開發就是要2個人把自己的想法、熱情都交給對方,一開始老師叫我們這樣練習的目的大家都認為太形式化,可是幾次下來我想大家或多或少都會有自己的收穫,都能從對方身上學到些東西,我想大家也會在這段時間裡慢慢成長起來。
軟體工程課堂練習--結對開發