设计思想:
首先要用一段代码,可以读入txt文件里的二维数组。需要将txt文件放入同一目录。
其次要用一段代码得到最大子数组的和:主要思路与求一维数组方法相差不多,不过要有更多的循环和判断汲取了先者的成果,我们得出了方法。思路如下:
1.得到子数组的最大行、列数,从第一行开始,确定最大子数组的行列范围。
2.将确定的范围,把最大子数组按照一列有几个数,按行分开成。(例如第一个组中只有一行,而第二个组中有两行,列数和数组的列数保持一致)
3,对2中得到的数组,利用一维数组求子数组之和的方法。求出最大值,比较得到最大的一个
4.使行列的最大上界下减1,重复进行第2 、3、4步。
首先要用一段代码,可以读入txt文件里的二维数组。需要将txt文件放入同一目录。
其次要用一段代码得到最大子数组的和:主要思路与求一维数组方法相差不多,不过要有更多的循环和判断汲取了先者的成果,我们得出了方法。思路如下:
1.得到子数组的最大行、列数,从第一行开始,确定最大子数组的行列范围。
2.将确定的范围,把最大子数组按照一列有几个数,按行分开成。(例如第一个组中只有一行,而第二个组中有两行,列数和数组的列数保持一致)
3,对2中得到的数组,利用一维数组求子数组之和的方法。求出最大值,比较得到最大的一个
4.使行列的最大上界下减1,重复进行第2 、3、4步。
源程序代码:
#include<iostream> #include <stdio.h> using namespace std; FILE *fpRead=fopen("input.txt","r"); char cgetchar(){ char c; fscanf(fpRead,"%c",&c); return c; } int getnum(){ char c; int num = 0, fuhao = 1; while((c = cgetchar()) != EOF && ('0' > c || '9' < c) && c != '-'); if(c == '-') fuhao = -1; else num = c - '0'; while((c = cgetchar()) != EOF && '0' <= c && '9' >= c){ num = num * 10 + c - '0'; } return num * fuhao; } int main () { int x,y,i,j,m=0,A[100][100]; x = getnum(); y = getnum(); if(x>100||y>100) { cout<<"请重新输入:"; cin>>x>>y; } for(i=0;i<x;i++) { for(j=0;j<y;j++) { A[i][j] = getnum(); printf("%d ", A[i][j]); } printf(" "); } int sum[100]={0},max=0,result=A[0][0]; for(i=0;i<x;i++)//确定子数组的最大上界(为第i行) { while(m+i<x)//确定子数组有m+i行 { //把子数组当成一位数组一样,求最大子数组的和 for(j=0;j<y;j++) { sum[j]=sum[j]+A[m+i][j]; } max=0; for(j=0;j<y;j++) { if(max+sum[j]>sum[j]) { max=max+sum[j]; } else { max=sum[j]; } if(max>result) { result=max; } } m++;//是子数组的行数+1 } m=0; for(j=0;j<y;j++) { sum[j]=0; } } cout<<result; return 0; }
input.txt文件截图:
运行结果截图:
项目计划总结:
我和队友的合照(张洪胜 苏雄)