数组3
Posted ab晶莹剔透ab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组3相关的知识,希望对你有一定的参考价值。
一、程序题目
返回一个二维整数数组中最大联通子数组的和。
二、程序要求
1、输入一个二维整形数组,数组中有正数也有负数。
2、求所有子数组的和的最大值,要求时间复杂度为O(n)。
3、程序要使用的数组放在一个叫input.txt的文件中,文件格式是:
数组的行数,
数组的列数,
每一行的元素,(用逗号分开)
4、每一个数字都是有符号32位整数,当然,行数和列数都是正整数。
三、程序设计思想
将二维矩阵转换成图的形式,即相邻两个数之间是联通的,记长度为1;根据图的遍历,将整个图从每个点都开始遍历一遍,便利时,当和小于0时断开两点间的路,当和大于最大和时最大和更新,这样,取以每个点为起点遍历的和的最大值即时最大联通子数组的和。遍历时,选取已遍历的联通子数组周围最大值遍历。
四、源程序代码
1 //李俏、张莹荧,2016.4.2 2 //求整数数组的最大子数组的和 3 4 #include<iostream> 5 #include<fstream> 6 #include<ctime> 7 using namespace std; 8 #define N 100 9 10 typedef struct 11 { 12 int dian[N]; 13 int xian[N][N]; 14 int diannum;//数组中元素个数 15 }Tu;//图 16 17 void set(Tu &shuzu, int x, int y) 18 { 19 int i, j; 20 fstream infile("input.txt", ios::in); //打开指定文件 21 if (!infile) 22 { 23 cout << "open error!" << endl; 24 exit(1); 25 } 26 infile >> x >> y; //从文件中读取数组行数和列数 27 shuzu.diannum = x*y; 28 for (i = 1; i <= shuzu.diannum; i++)//从文件中读取数组元素 29 { 30 infile >> shuzu.dian[i]; 31 } 32 infile.close(); 33 34 for (i = 1; i <= shuzu.diannum; i += y) 35 { 36 for (j = i; j <= i + y - 2; j++) 37 { 38 shuzu.xian[j][j + 1] = 1; 39 shuzu.xian[j + 1][j] = 1; 40 } 41 } 42 for (i = 1 + y; i<shuzu.diannum; i += y) 43 { 44 for (j = i; j <= i + x - 1; j++) 45 { 46 shuzu.xian[j][j - y] = 1; 47 shuzu.xian[j - y][j] = 1; 48 } 49 }//将一维数组转换成二维图的形式 50 } 51 52 void output(Tu shuzu)//以图的形式输出数组 53 { 54 for (int i = 1; i <= shuzu.diannum; i++) 55 { 56 cout << shuzu.dian[i]; 57 if (shuzu.xian[i][i + 1] == 1) 58 cout << " "; 59 else 60 cout << endl; 61 } 62 } 63 64 void bianli(Tu &shuzu, int v, int visit[], int &b, int &max, int x)//遍历图 65 { 66 visit[v] = 1; 67 68 max += shuzu.dian[v]; 69 if (max >= b) 70 b = max; 71 72 int a = 0, bo = 0; 73 for (int w = 1; w <= shuzu.diannum; w++) 74 { 75 for (int c = 1; c <= shuzu.diannum; c++) 76 { 77 if ((visit[w] == 0) && (shuzu.xian[c][w] == 1) && (visit[c] == 1)) 78 { 79 a = w; 80 bo = 1; 81 break; 82 } 83 } 84 if (bo == 1) 85 { 86 break; 87 } 88 } 89 for (int w = 1; w <= shuzu.diannum; w++) 90 { 91 for (int c = 1; c <= shuzu.diannum; c++) 92 { 93 if ((visit[w] == 0) && (shuzu.xian[c][w] == 1) && (visit[c] == 1)) 94 { 95 if (shuzu.dian[a]<shuzu.dian[w]) 96 { 97 a = w; 98 } 99 } 100 } 101 } 102 if (b + shuzu.dian[a]<0) 103 { 104 shuzu.xian[v][a] = 0; 105 } 106 else 107 { 108 bianli(shuzu, a, visit, b, max, x); 109 } 110 } 111 112 int NoVisit(int visit[], Tu shuzu) 113 { 114 int k = 0, i; 115 for (i = 1; i <= shuzu.diannum; i++) 116 { 117 if (visit[i] == 0) 118 { 119 k = i; 120 break; 121 } 122 } 123 return k; 124 }//判断图中没有visit的项 125 126 int main() 127 { 128 Tu shuzu; 129 int x, y; 130 int i; 131 132 fstream infile("input.txt", ios::in); //打开指定文件 133 if (!infile) 134 { 135 cout << "open error!" << endl; 136 exit(1); 137 } 138 infile >> x >> y; //从文件中读取数组行数和列数 139 for (i = 1; i <= x*y; i++) 140 { 141 infile >> shuzu.dian[i]; 142 } 143 infile.close(); 144 set(shuzu, x, y); 145 cout << "数组为:" << endl; 146 output(shuzu); 147 148 int v = 1, b[N] = { 0 }, h = 0; 149 150 for (i = 1; i <= shuzu.diannum; i++) 151 { 152 if (shuzu.dian[i]<0) 153 { 154 b[i] = shuzu.dian[i]; 155 } 156 else 157 { 158 int visit[N] = { 0 }; 159 int max = 0; 160 bianli(shuzu, i, visit, b[i], max, x); 161 } 162 } 163 164 int max = b[1]; 165 for (int i = 2; i <= shuzu.diannum; i++) 166 { 167 if (b[i]>max) 168 max = b[i]; 169 } 170 cout << "最大联通子数组的和为:" << max << endl; 171 172 return 0; 173 }
六、时间记录日志:
学生:张莹荧 日期:2016-04-06
教师:王建民 课程: PSP
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
4.03 |
14:30 16:10 |
16:00 17:40 |
0 0 |
90 90 |
编程 阅读课本 |
中间上网、休息 |
4.04 |
8:00 14:00 |
12:00 15:50 |
40 10 |
200 100 |
上课 | 课间休息 |
4.05 |
14:30 19:00 |
17:40 19:30 |
10 0 |
180 30 |
编程 阅读课本 |
中间休息 |
4.06 |
12:30 19:00 |
13:30 19:30 |
0 0 |
60 30 |
编程 阅读课本 |
|
七、缺陷记录日志
学生: 李俏,张莹荧
日期: 2016年4月6日
教员: 王建民
程序号: 4
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
4.4 | 1 | 数组 | 设计 | 编译 | 15min | |
描述:数组长度不合适,导致元素缺失 | ||||||
4.6 | 2 | 文件 | 设计 | 编译 | 30min | |
描述:没有考虑好,把问题想复杂了,不能有效地从文件中读出数据 |
以上是关于数组3的主要内容,如果未能解决你的问题,请参考以下文章