一、题目及要求
题目:返回一个二维整数数组中最大联通子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:
数组的行数,
数组的列数,
每一行的元素
每一个数字都是有符号32位整数,当然,行数和列数都是正整数。
二、设计思想
因为每一个数字都是有符号32位整数,所以选择了long型。从文件中读取,采用c++输入输出流。矩阵中的数是随机生成的,可能会有正有负,所以要首先判断二维数组中哪些位置上的数是正数,利用另一个二维数组记录正数的位置,然后判断哪些数是连通的,我的思路是先判断两个数的行数(列数)是否相同,如果相同,再判断列数(行数)是否相邻,如果相邻即证明两个数连通,计算每个连通块的数值的和,然后再连通不同的块,计算其和,最后比较其中的最大值,即为二维整数数组中最大联通子数组的和。
三、源代码
#include<iostream> #include<fstream> using namespace std; long Max(long n,long a[],long *smark,long *mmark) { long b[100]={0}; long sum1=0,max1=0,i; for(i=0;i<n;i++) { if(sum1<0) { sum1=a[i]; } else { sum1=sum1+a[i]; } b[i]=sum1; } max1=b[0]; for(i=0;i<n;i++) { if (max1<b[i]) { max1= b[i]; *mmark = i; } } for (i = *mmark;i >= 0;i--) { if (b[i] == a[i]) { *smark = i; break; } } return max1; } int main() { long m,n,i,j,t2,c[2]; long sum,smark,mmark; long up[100],down[100],t[100]; long a[100][100],b[100]; ifstream infile; infile.open("input.txt", ios::in); if(infile.is_open() == false) { cerr << "open error!" << endl; exit(1); } cout<<"二维数组的行数和列数:"; for(i=0;i<2;i++) { infile >> c[i]; } //在显示器上顺序显示个数 m=c[0]; n=c[1]; cout<<m<<" "<<n<<endl; cout<<"数组为"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) { infile>>a[i][j]; cout<<a[i][j]<<" "; } if(j%n==0) { cout<<endl; } } //把二维数组按行分解为几个一维数组 for(i=0;i<m;i++) { for(j=0;j<n;j++) { b[j]=a[i][j]; } sum=Max(n,b,&smark,&mmark); up[i]=smark; down[i]=mmark; t[i]=sum; } t2=t[0]; for(i=0;i+1<m;i++) { if(up[i]<=down[i+1] && down[i]>=up[i+1]) { t2+=t[i+1]; } for(j=up[i];j<up[i+1];j++) { if(a[i+1][j]>0) t2+=a[i+1][j]; //判别独立正数 } } cout<<"最大联通子数组和为"; cout<<t2<<endl; return 0; }
四、结果截图
五、项目计划日志
日期&&任务 |
听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总计 |
周一 | 100 | 30 | 30 | 160 | |
周二 | 120 | 30 | 30 | 180 | |
周三 | 30 | 30 | 10 | 70 | |
周四 | 100 | 20 | 30 | 150 | |
周五 | 120 | 30 | 30 | 180 | |
周六 | 145 | 30 | 10 | 85 | |
周日 | 200 | 30 | |||
周总计 | 200 | 635 | 210 | 110 |
1155 |
时间记录日志
3/28
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/28 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
21:04 | 21: 34 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
22:10 | 22: 40 | 0 | 30 | 网上查找资料 | 查阅安卓相关资料 | |
3/29 | 18:00 | 18:30 | 0 | 30 | 阅读书籍 | 《构建之法》 |
19:00 | 21:30 | 20 | 120 | 编写程序 | 结对开发- 安卓APP | |
22: 15 | 22: 45 | 0 | 30 | 网上查找资料 | 查阅安卓相关资料 | |
3/30 | 19: 25 | 20: 00 | 5 | 30 | 编写程序 | 结对开发- 安卓APP |
22:00 | 22: 30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
22:40 | 22: 50 | 0 | 10 | 查找资料 | 查阅安卓相关资料 | |
3/31 | 14:00 | 15: 50 | 10 | 100 | 上课 | 软件工程上课 |
18:26 | 18: 50 | 4 | 20 | 编写程序 | 结对开发- 联通版 | |
22:00 | 22:30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
4/1 | 14: 00 | 16: 20 | 20 | 120 | 编写程序 | 结对开发- 安卓APP |
11:23 | 12: 00 | 7 | 30 | 网上查找资料 | 查阅安卓相关资料 | |
21:00 | 21:30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
4/2 | 7: 00 | 7: 30 | 0 | 30 | 阅读书籍 | 阅读《构建之法》 |
10: 00 | 13: 00 | 35 | 145 | 编写程序 | 结对开发- 安卓APP | |
9: 45 | 9: 55 | 0 | 10 | 网上查找资料 | 查阅安卓相关资料 | |
4/3 | 8:20 | 12: 00 | 20 | 200 | 编写程序 | 结对开发-联通版 |
15: 23 | 16: 00 | 7 | 30 | 阅读书籍 | 阅读《构建之法》 |
缺陷记录日志
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 备注 |
3/31 | 1 | 20 | 编码 | 编译 | 4 | 最开始没有定义long型 |
3/31 | 2 | 20 | 编码 | 编译 | 1 | 文件打开有问题 |
4/1 | 3 | 20 | 编码 | 编译 | 7 | 当数组长度为0时,无法正常跳出 |