二维数组最大子数组和的求解
一.设计思想
首先要用一段代码,可以读入txt文件里的二维数组。需要将txt文件放入同一目录。
其次要用一段代码得到最大子数组的和:主要思路与求一维数组方法相差不多,不过要有更多的循环和判断汲取了先者的成果,我们得出了方法。思路如下:
1.得到子数组的最大行、列数,从第一行开始,确定最大子数组的行列范围。
2.将确定的范围,把最大子数组按照一列有几个数,按行分开成。(例如第一个组中只有一行,而第二个组中有两行,列数和数组的列数保持一致)
3,对2中得到的数组,利用一维数组求子数组之和的方法。求出最大值,比较得到最大的一个
4.使行列的最大上界下减1,重复进行第2 、3、4步。
首先要用一段代码,可以读入txt文件里的二维数组。需要将txt文件放入同一目录。
其次要用一段代码得到最大子数组的和:主要思路与求一维数组方法相差不多,不过要有更多的循环和判断汲取了先者的成果,我们得出了方法。思路如下:
1.得到子数组的最大行、列数,从第一行开始,确定最大子数组的行列范围。
2.将确定的范围,把最大子数组按照一列有几个数,按行分开成。(例如第一个组中只有一行,而第二个组中有两行,列数和数组的列数保持一致)
3,对2中得到的数组,利用一维数组求子数组之和的方法。求出最大值,比较得到最大的一个
4.使行列的最大上界下减1,重复进行第2 、3、4步。
二.代码
1 #include<iostream> 2 #include <stdio.h> 3 using namespace std; 4 5 FILE *fpRead=fopen("input.txt","r"); 6 7 char cgetchar(){ 8 char c; 9 fscanf(fpRead,"%c",&c); 10 return c; 11 } 12 13 int getnum(){ 14 char c; 15 int num = 0, fuhao = 1; 16 while((c = cgetchar()) != EOF && ('0' > c || '9' < c) && c != '-'); 17 if(c == '-') fuhao = -1; 18 else num = c - '0'; 19 while((c = cgetchar()) != EOF && '0' <= c && '9' >= c){ 20 num = num * 10 + c - '0'; 21 } 22 return num * fuhao; 23 } 24 25 int main () 26 { 27 int x,y,i,j,m=0,A[100][100]; 28 29 x = getnum(); 30 y = getnum(); 31 if(x>100||y>100) 32 { 33 cout<<"请重新输入:"; 34 cin>>x>>y; 35 } 36 for(i=0;i<x;i++) 37 { 38 for(j=0;j<y;j++) 39 { 40 A[i][j] = getnum(); 41 printf("%d ", A[i][j]); 42 } 43 printf("\n"); 44 45 } 46 int sum[100]={0},max=0,result=A[0][0]; 47 48 for(i=0;i<x;i++)//确定子数组的最大上界(为第i行) 49 { 50 while(m+i<x)//确定子数组有m+i行 51 { 52 //把子数组当成一位数组一样,求最大子数组的和 53 for(j=0;j<y;j++) 54 { 55 sum[j]=sum[j]+A[m+i][j]; 56 57 } 58 max=0; 59 for(j=0;j<y;j++) 60 { 61 if(max+sum[j]>sum[j]) 62 { 63 max=max+sum[j]; 64 } 65 else 66 { 67 max=sum[j]; 68 } 69 if(max>result) 70 { 71 result=max; 72 } 73 } 74 m++;//是子数组的行数+1 75 } 76 m=0; 77 for(j=0;j<y;j++) 78 { 79 sum[j]=0; 80 } 81 } 82 cout<<result; 83 return 0; 84 }
三.运行截图及所用txt数据
四.项目计划总结
五.和队友并肩作战的照片(苏雄,张洪胜)