数组练习3 求最大连通子数组的和

一、题目要求

1、返回一个二维整数数组中最大连通子数组的和。

二、设计思路

刚开始看到这个题目时,想了应该对其降维,然后再一维数组的基础上解决问题更方便,但是一直想不到办法,然后在老师的指导下,想到了离散和数据结构曾经学到的有关图的联通的解决办法,将二维数组看成一个图来遍历来寻找最大子数组的和。

本次实验,老师要求从文件中读入行和列还有数组元素,我们利用fstream实现从文件的读入,一次读入行列和数组元素。

本次实验我们没有能实现有符号的32位整数的大数的运算,实验完成度没有达到要求。

三、程序代码

  1 //结对开发成员;张晓菲 张哲
  2 //本次实验题目为:求二维数组中的最大连通子数组的和
  3 #include<iostream>
  4 #include<ctime>
  5 #include<fstream>
  6 using namespace std;
  7 #define N 100
  8
  9 typedef struct
 10 {
 11     int array[N];
 12     int col[N][N];
 13     int countnum;
 14 }Struct;//定义结构体变量
 15
 16 void input(Struct &num, int x, int y)
 17 {//input用于实现从文件中读取行和列并输出到屏幕上
 18     num.countnum = x*y;
 19     int i = 1;
 20     int a, b;
 21     ifstream in = ifstream("input.txt");
 22     in >> a;
 23     in >> b;
 24     num.countnum = a*b;
 25     while (in >> num.array[i])
 26     {//将in文件中的数字读取到数组中
 27         ++i;
 28     }
 29     in.close();//读取完毕关闭文件in
 30     for (int i = 1; i <= num.countnum; i++)
 31     {
 32         cout << num.array[i] << " ";
 33         if (i%b == 0)
 34         {
 35             cout << endl;
 36         }
 37     }//输出文件导入的数组到屏幕
 38     for (int i = 1; i <= num.countnum; i += y)
 39     {
 40         for (int j = i; j <= i + y - 2; j++)
 41         {
 42             num.col[j][j + 1] = 1;
 43             num.col[j + 1][j] = 1;
 44         }
 45     }
 46     for (int i = 1 + y; i<num.countnum; i += y)
 47     {
 48         for (int j = i; j <= i + x - 1; j++)
 49         {
 50             num.col[j][j - y] = 1;
 51             num.col[j - y][j] = 1;
 52         }
 53     }
 54 }
 55
 56 void traverse(Struct &num, int v, int visit[], int &b, int &max, int x)
 57 {//通过对数组的遍历寻找最大连通子数组
 58     int a = 0, var = 0;
 59     visit[v] = 1;
 60     max += num.array[v];
 61     if (max >= b)
 62     {
 63         b = max;
 64     }
 65    for (int w = 1; w <= num.countnum; w++)
 66     {
 67         for (int c = 1; c <= num.countnum; c++)
 68         {
 69             if ((visit[w] == 0) && (num.col[c][w] == 1) && (visit[c] == 1))
 70             {
 71                 a = w;
 72                 var = 1;
 73                 break;
 74             }
 75         }
 76         if (var == 1)
 77             break;
 78     }
 79     for (int w = 1; w <= num.countnum; w++)
 80     {
 81         for (int c = 1; c <= num.countnum; c++)
 82         {
 83             if ((visit[w] == 0) && (num.col[c][w] == 1) && (visit[c] == 1))
 84             {
 85                 if (num.array[a]<num.array[w])
 86                     a = w;
 87             }
 88         }
 89     }
 90     if (b + num.array[a]<0)
 91     {
 92         num.col[v][a] = 0;
 93     }
 94     else
 95         traverse(num, a, visit, b, max, x);
 96 }
 97
 98
 99 int main()
100 {
101     int x, y;
102     fstream fs("input.txt");
103     fs >> x;
104     fs >> y;
105     cout << x << " " << y << endl;
106     Struct num;
107     input(num, x, y);
108     int v = 1, b[N] = { 0 }, h = 0;
109     for (int i = 1; i <= num.countnum; i++)
110     {
111         if (num.array[i]<0)
112         {
113             b[i] = num.array[i];
114         }
115         else
116         {
117             int visit[N] = { 0 };
118             int max = 0;
119             traverse(num, i, visit, b[i], max, x);
120         }
121     }
122
123     int max = b[1];
124     for (int i = 2; i <= num.countnum; i++)
125     {
126         if (b[i]>max)
127             max = b[i];
128     }
129     cout << "该数组中最大连通子数组的和为:" << max << endl;
130 }

四、实验运行结果

(1)、input文件内

屏幕显示

五、时间记录日志

日期 开始时间 结束时间 中断时间(min) 净时间(min) 活动 备注

3月28号

星期一

14:00 15:50 10(课间) 100 听课 软件工程

3月29号

星期二

20:00 22:00 0 120 编程 四则运算网页版

3月30号

星期三

15:00 17:00 10(休息) 110 编程 四则运算网页版
  20:00 22:10 10(休息) 120 编程 四则运算网页版

3月31号

星期四

14:00 15:50 10(课间) 100 听课 软件工程
  20:30 22:00 10(休息) 80 编程
二维数组3

最大连通子数组和


4月2号

星期六

14:00 17:00 20 160 编程
四则运算网页版


4月3号

星期日

14:30 18:00 30 180 编程
四则运算网页版


4月4号

星期一

19:30 22:30 0 180 编程
四则运算网页版


4月5号

星期二

8:00 10:00 0 120 编程
二维数组3

最大连通子数组的和

  19:30 23:00 0 210 编程
四则运算网页版


4月6号

星期三

14:20 17:10 0 150 编程
四则运算网页版

二维数组3

写博客

六、实验总结

通过本次实验,我学到了很多东西,在实验的开始,我们对数组的思考,将其转换为图的方法来解决问题,对之前学过的知识来说是一个很好的利用,实验过程中开始我们对结构的使用比较陌生,之前编程用到的少,再查阅相应资料后得以实现,总之通过这次结对开发的实验设计,收获很多,学到了很多。

时间: 2024-10-10 06:47:38

数组练习3 求最大连通子数组的和的相关文章

二维数组求最大连通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数. 源程序 /* 设计思路: 1.首先从文件读入一个二维整型数组(有正有负): 2.从数组中选出最小的一个数,如果为负数则除去,检验联通性: 3.联通,接下来找剩余中最小的数,

最大连通子数组的和

题目要求: 1.返回一个二维数整数组中最大联通子数组的和 2.数组中有正数,也有负数 3.求所有子数组的最大值 4.程序要使用的数组放在txt文件中 思路: 利用动态规划求出每一行的最大子数组 并标记最大子数组中的数flag为1 根据flag求出up[],down[],标记最大子数组起始结束位置,用来判断单个数 根据flag值判定是否联通,若联通则相加,不联通继续扫描 若有多行联通——————(bug) 若只有一行,扫描下一行与之相联通的数,若是整数则相加,负数不做动作 以此为基础形成迭代 缺陷

Task 4.5 求二维数组中的最大连通子数组之和

任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下.开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0:将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最

求最大联通子数组的和(结对开发)

结对伙伴: 纪烈翔 博客名:我们都是小怪兽 链接:http://www.cnblogs.com/qwer113/ 设计思想: 1:在c++默认路径下创建input.txt 2:在txt中输入矩阵的行.列,以及对应的数 3:按列遍历,求出没列最大子数组,再求出相应结果 程序源代码 1 //返回二维整数组中最大联通子数组的和 2 //2016/4/4 3 #include<iostream> 4 using namespace std; 5 #include<fstream> 6 in

求环形连续子数组的和的最大值

课上老师把连续子数组求和的题目改为让子数组首尾相接再求最大子数组的和. 我的处理方法:新建一个二倍原数组长度b的数组d[  ],然后从d[0]到d[b]分别生成b个分数组,再分别求子数组和,再比较. package wodeshiyao; import java.util.Scanner; public class shiyan321 { static Scanner scan=new Scanner(System.in); public static void main(String[] ar

从数组中返回指定长度的子数组[转]

1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Runtime.Serialization; 5 using System.Runtime.Serialization.Formatters.Binary; 6 7 namespace ConsoleApplication3 8 { 9 class Program 10 { 11 static void Main(string

动态规划--求最大连续子数组的和(Python实现)&amp;求解最大连续乘积字串(Python实现)

def MaxSum(self,array,n): sum=array[0] result=array[0] for i in range(0,n): if sum<0: sum=a[i] else: sum=sum+a[i] start1=i if sum>result: result=sum end=i start=start1 print result,start,end 上述采用的是动态规划思想:假设sum[i]表示以第i个元素结尾的最大连续字串,那么sum[i]=max{sum[i-

js数组对象的父数据对象-子数组对象,(数组对象相减)

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><script> var gridData_1=[{"name":"123",age:12},{"name":&q

《团队开发一(求一个数组的连续的子数组之和的最大值)》

(1)设计思想:一般的,求一个数组的最大子数组之和即是按数组顺序依次让前几个数的和与下一个数进行比较,设一变量来装每次比较后的较大的数,依此进行到数组终端:但是考虑到求的是连续的子数组,则应该想到除了在按顺序上的连续外,还得考虑到末端与首端的连续,所以按数组顺序依次求解得到的未必就是连续的最大的子数组之和,故此必须在此种情况下也求解出最大子数组之和,方法即是同时从数组的两端依次进行求出各自的最大子数组之和,然后在相遇前求和后与之前所求的最大子数组之和依次相比较,取它们中最大的一个作为连续的最大子