一、题目
返回一个二维整数数组中最大联通子数组的和。
二、要求
输入一个二维整型数组,数组里有正数也有负数。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
程序所要使用的数组放在一个input.txt的文件中。
三、设计思想
本次实验设计思路是根据课上同学讲的方法写的,主要是:正数加进来,遇到负数就跳过。
数据好像流水一般,就往正数方向流动并相加,直到取得的最大联通子数组和最大。
四、源代码
1 //数组04 2 //胡浩特、朱子嘉 2016/4/5 3 4 #include<iostream> 5 #include<ctime> 6 #include<fstream> 7 using namespace std; 8 9 void main() 10 { 11 int m, n, i, j, sum; 12 int smark, mmark, t2; 13 int up[100], down[100], t[100]; 14 int a[100][100], b[100]; 15 16 cout << "请输入二维数组的行数:" << endl; 17 cin >> m; 18 cout << "请输入二维数组的列数:" << endl; 19 cin >> n; 20 cout << "请输入二维数组的元素:" << endl; 21 for (i = 0; i<m; i++) 22 { 23 for (j = 0; j<n; j++) 24 { 25 cin >> a[i][j];//输入二维数组的元素 26 } 27 } 28 29 for (i = 0; i<m; i++) 30 { 31 for (j = 0; j<n; j++) 32 { 33 b[j] = a[i][j]; 34 } 35 int c[100] = { 0 }; 36 int sum1 = 0, max1 = 0, k; 37 for (k = 0; k<n; k++) //在列上求每一个最大子数组 38 { 39 if (sum1<0) 40 { 41 sum1 = b[k]; 42 } 43 else 44 { 45 sum1 = sum1 + b[k]; 46 } 47 c[k] = sum1; 48 } 49 max1 = c[0]; 50 for (k = 0; k<n; k++) 51 { 52 if (max1<c[k]) 53 { 54 max1 = c[k]; 55 mmark = k; 56 } 57 } 58 for (k = mmark; k >= 0; k--) 59 { 60 if (c[k] == b[k]) 61 { 62 smark = k; 63 break; 64 } 65 } 66 sum = max1; 67 68 up[i] = smark; 69 down[i] = mmark; 70 t[i] = sum; 71 72 } 73 t2 = t[0]; 74 for (i = 0; i + 1<m; i++) 75 { 76 if (up[i] <= down[i + 1] && down[i] >= up[i + 1]) 77 { 78 t2 += t[i + 1]; 79 } 80 for (j = up[i]; j<up[i + 1]; j++) 81 { 82 if (a[i + 1][j]>0) t2 += a[i + 1][j]; //判别独立正数 83 } 84 85 } 86 //文件输出 87 ofstream fout("D:\\input.txt", ios::binary); 88 for (i = 0; i<m; i++) 89 { 90 for (j = 0; j<n; j++) 91 { 92 fout << a[i][j] << " "; 93 94 } 95 fout << endl; 96 } 97 98 fout << "最大联通子数组的和为:" << t2 << endl; 99 100 }
五、实验截图
来源:https://www.cnblogs.com/JYQ-hu/p/5359981.html