题目:返回二维数组最大联通子数组的和
设计思路:首先,利用文件读入读出流,读取二维数组,再利用降维的思想,求每一行的最大子数组块,遍历所有行,再将各行的最大子数组块进行判断合并。
代码:
#include<iostream> #include<fstream> using namespace std; # define N 100 int zuida(long long int n, long long int a[], long long int *p, long long int *q)//一维数组的最大子数组和 { long long int b[N] = { 0 }; long long int i, sum1 = 0, max1 = 0; 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]; *q = i; //记录最大子数组的终点位置 } } for (i = *q; i >= 0; i--) { if (b[i] == a[i]) { *p = i;//记录最大子数组的起点 break; } } return max1; } int main() { long long int m1, m2, i, j, p, q, t2; long long int sum, max; long long int left[N], right[N], t[N]; long long int a[N][N], b[N]; ifstream fin("sz.txt"); ifstream fin1("sz1.txt"); fin1 >> m1 >> m2; if (m1 <= 0&&m2<=0) { cout << "输入的行列不正确" << endl; return 0; } cout << "二维数组的行和列为"<< endl; cout << m1 << " " << m2 << endl; for (int i = 0; i < m1; i++) for (int j = 0; j < m2; j++) { fin >> a[i][j]; } cout << "TXT文件中的二维数组为" << endl; for (int i = 0; i < m1; i++) { for (int j = 0; j < m2; j++) { cout << a[i][j] << " "; } cout << endl; } for (i = 0; i<m1; i++)//求每一行最大子数组 { for (j = 0; j<m2; j++) { b[j] = a[i][j]; } sum = zuida(m1, b, &p, &q); left[i] = p; //记录最大子数组的坐标位置 right[i] = q; t[i] = sum; } t2 = t[0]; for (i = 0; i + 1<m2; i++)//将最大子数组合并 { if (left[i] <= right[i + 1] && right[i] >= left[i + 1])//两行的最大子数组块相连 { t2 += t[i + 1]; } for (j = left[i]; j<left[i + 1]; j++) { if (a[i + 1][j]>0) t2 += a[i + 1][j]; //判别独立正数 } } cout <<"最大子数组和为:"<< t2 << endl; return 0; }
测试结果:
===== ===== ===== ===== =====
Compiling...
Compiling done.
===== ===== ===== ===== =====
Doing Unit Test Case 01
lrwxr-xr-x 1 Liam staff 12B 5 19 08:31 input.txt -> cases/01.txt
二维数组的行和列为
0 0
TXT文件中的二维数组为
0 0
最大子数组和为:无,提醒输入错误。
Done: 01.
===== ===== ===== ===== =====
Doing Unit Test Case 02
lrwxr-xr-x 1 Liam staff 12B 5 19 08:31 input.txt -> cases/02.txt
二维数组的行和列为
3 3
TXT文件中的二维数组为
1 5 10
-5 10 -20
-10 10 5
最大子数组和为:31
ALL DONE.
===== ===== ===== ===== =====
总结:这次开发利用上次程序的思想-降维,也复习了以前的文件读入读出流,由于前几个程序助教指出我的程序没有单元测试,所以自己后来又从新检查了下程序,对程序进行边
界的测试,补上了如果输入的行列数为非正整数时,程序应该做出的反应,要提醒用户输入不正确。
开发日志:
星期 | 听课 | 上网查资料 | 编程 | 读书 | 总计 |
周二 | 1 | 1 | 2 | ||
周三 | 0 | ||||
周四 | 2 | 2 | |||
周五 | 1 | 3 | |||
周一 | 1 | 1 | 1 | 3 | |
周二 | 2 | 1 | 3 | ||
周三 | 1 | 2 | 1 | 4 | |
总计 | 2 | 5 | 5 | 3 | 15 |
时间记录日志:
日期 | 开始时间 | 结束时间 | 休息时间 | 工作时间 | 活动内容 |
4/1 | 19:30 | 20:30 | 0 | 60 | 结对开发 |
4/4 | 16:30 | 17:30 | 0 | 60 | 结对开发 |
4/5 | 19:00 | 20:00 | 0 | 60 | 结对开发 |
4/6 | 13:50 | 15:30 | 20 | 100 | 结对开发 |
缺陷记录日志:
对文件的读入读出掌握的不太好,不够灵活,自己对二维数组的情况变化考虑的也不是很全面,近期将完善。
队友博客:http://home.cnblogs.com/u/apan008/
来源:https://www.cnblogs.com/lvstudy/p/5359896.html