求数组中最大子数组的和03
2016-04-06 17:19
218 查看
题目:返回一个二维整数数组中的最大连通子数组的和
要求:输入一个二维整形数组,有正数、有负数;
求所有子数组的和的最大值。
设计思路:刚看到这个题目时,说实话,确实一点儿思路都没有,后来听同学去讲台上讲思路,经过课下结合之前学过的知识和队友讨论了讨论,捋清了基本思路,大致如下:利用遍历的思想,以及寻找路径的方法,在遍历二维数组中按照优化思想逐个找出理想的数值相加,按照最小代价直到选出二维数组中最大的子数组的和为止。
源代码:
View Code
运行结果截图:
![](http://images2015.cnblogs.com/blog/718677/201604/718677-20160406165308859-1763400107.png)
![](http://images2015.cnblogs.com/blog/718677/201604/718677-20160406165320234-1308355671.png)
时间计划日志:
本打算每天花两个小时的时间把最大连通子数组的和这个程序写出来,实际平均每天用的时间要比这个多一点点。
缺陷记录日志:
没有判断文件中如果是非整数或者非数字该如何处理。
时间记录日志:
要求:输入一个二维整形数组,有正数、有负数;
求所有子数组的和的最大值。
设计思路:刚看到这个题目时,说实话,确实一点儿思路都没有,后来听同学去讲台上讲思路,经过课下结合之前学过的知识和队友讨论了讨论,捋清了基本思路,大致如下:利用遍历的思想,以及寻找路径的方法,在遍历二维数组中按照优化思想逐个找出理想的数值相加,按照最小代价直到选出二维数组中最大的子数组的和为止。
源代码:
//结对开发成员;张晓菲 张哲 //本次实验题目为:求二维数组中的最大连通子数组的和 #include<iostream> #include<ctime> #include<fstream> using namespace std; #define N 100 typedef struct { int array ; int col ; int countnum; }Struct;//定义结构体变量 void input(Struct &num, int x, int y) {//input用于实现从文件中读取行和列并输出到屏幕上 num.countnum = x*y; int i = 1; int a, b; ifstream in = ifstream("input.txt"); in >> a; in >> b; num.countnum = a*b; while (in >> num.array[i]) {//将in文件中的数字读取到数组中 ++i; } in.close();//读取完毕关闭文件in for (int i = 1; i <= num.countnum; i++) { cout << num.array[i] << " "; if (i%b == 0) { cout << endl; } }//输出文件导入的数组到屏幕 for (int i = 1; i <= num.countnum; i += y) { for (int j = i; j <= i + y - 2; j++) { num.col[j][j + 1] = 1; num.col[j + 1][j] = 1; } } for (int i = 1 + y; i<num.countnum; i += y) { for (int j = i; j <= i + x - 1; j++) { num.col[j][j - y] = 1; num.col[j - y][j] = 1; } } } void traverse(Struct &num, int v, int visit[], int &b, int &max, int x) {//通过对数组的遍历寻找最大连通子数组 int a = 0, var = 0; visit[v] = 1; max += num.array[v]; if (max >= b) { b = max; } for (int w = 1; w <= num.countnum; w++) { for (int c = 1; c <= num.countnum; c++) { if ((visit[w] == 0) && (num.col[c][w] == 1) && (visit[c] == 1)) { a = w; var = 1; break; } } if (var == 1) break; } for (int w = 1; w <= num.countnum; w++) { for (int c = 1; c <= num.countnum; c++) { if ((visit[w] == 0) && (num.col[c][w] == 1) && (visit[c] == 1)) { if (num.array[a]<num.array[w]) a = w; } } } if (b + num.array[a]<0) { num.col[v][a] = 0; } else traverse(num, a, visit, b, max, x); } int main() { int x, y; fstream fs("input.txt"); fs >> x; fs >> y; cout << x << " " << y << endl; Struct num; input(num, x, y); int v = 1, b = { 0 }, h = 0; for (int i = 1; i <= num.countnum; i++) { if (num.array[i]<0) { b[i] = num.array[i]; } else { int visit = { 0 }; int max = 0; traverse(num, i, visit, b[i], max, x); } } int max = b[1]; for (int i = 2; i <= num.countnum; i++) { if (b[i]>max) max = b[i]; } cout << "该数组中最大连通子数组的和为:" << max << endl; }
View Code
运行结果截图:
![](http://images2015.cnblogs.com/blog/718677/201604/718677-20160406165308859-1763400107.png)
![](http://images2015.cnblogs.com/blog/718677/201604/718677-20160406165320234-1308355671.png)
时间计划日志:
本打算每天花两个小时的时间把最大连通子数组的和这个程序写出来,实际平均每天用的时间要比这个多一点点。
缺陷记录日志:
没有判断文件中如果是非整数或者非数字该如何处理。
时间记录日志:
日期 | 开始时间 | 结束时间 | 中断时间(min) | 净时间(min) | 活动 | 备注 |
3月28号 星期一 | 14:00 | 15:50 | 10(课间) | 100 | 上课 | 软件工程 |
3月29号 星期二 | 20:00 | 22:00 | 0 | 120 | 编程 | 四则运算网页版 |
3月30号 星期三 | 15:00 | 17:00 | 10(休息) | 110 | 编程 | 四则运算网页版 |
20:00 | 22:10 | 10 | 120 | 编程 | 四则运算网页版 | |
3月31号 星期四 | 14:00 | 15:50 | 10(课间) | 100 | 上课 | 软件工程 |
20:30 | 22:00 | 10(休息) | 80 | 编程 | 最大连通子数组和 | |
4月2号 星期六 | 14:00 | 17:00 | 20(休息) | 160 | 编程 | 四则运算网页版 |
4月3号 星期日 | 14:30 | 18:00 | 30 | 180 | 编程 | 四则运算网页版 |
4月4号 星期一 | 19:30 | 22:30 | 0 | 180 | 编程 | 四则运算网页版 |
4月5号 星期二 | 8:00 | 10:00 | 0 | 120 | 编程 | 最大连通子数组和 |
19:30 | 23:00 | 0 | 210 | 编程 | 四则运算网页版 | |
4月6号 星期三 | 14:20 | 17:10 | 0 | 150 | 编程 | 最大连通子数组和 最大连通子数组和 整理、发博客 |
相关文章推荐
- 2016年3月28日作业
- 关于排序的总结和部分实现(个人理解整理版)
- 关于计算列
- \Yii::$app 属性整理
- 机器学习:金融领域的岗位需求
- openssl 安装
- mysql复制表结构、表数据
- 标准输出、标准错误重定向(格式)
- Vim 使用和技巧
- 《深入理解计算机系统》读书笔记五
- 循环滚动
- 转帖Jmeter中的几个重要测试指标释义
- 软件工程android项目简介
- UITableViewCell 的CATransform3D动画
- 进程大概枝杈【A篇】
- Java集合容器类
- Retrofit(重构——图片下载)
- 师傅又被妖怪抓走了
- Android实现登录邮箱的自动补全功能
- [POJ1001]狼抓兔子 做题笔记