一、题目
返回一个二维整数数组中最大联通子数组的和。
二、要求
输入一个二维整型数组,数组里有正数也有负数。
求所有子数组的和的最大值。要求时间复杂度为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