数组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  
描述:没有考虑好,把问题想复杂了,不能有效地从文件中读出数据

 

 

 

 

 

 

 

 

 

 

八、结对开发队友
  李俏 信1301-2班 20132912
  博客地址:http://www.cnblogs.com/Aliqiao/
  工作照:
  
  
  

以上是关于数组3的主要内容,如果未能解决你的问题,请参考以下文章

数组3

一本通1116:最长平台

题目:返回一个整数数组中最大子数组的和。

面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)

8.19 数组中子数组的最大累乘积

PTA基础编程题目集6-3简单求和 (函数题)