联通子数组(一)

本次实验任务:

思路分析:

将二维拆分为一维,先求得每一行的最大子数组的和,并且求得每一行最大子数组的起始元素和终止元素,与其他行的进行比较,检查是否联通,若联通,则将两行的子数组最大值和相加,找出不同行子数组最大值求和的最大值即为所求

已实现的代码:

 1 #include<iostream>
 2 #include<ctime>
 3 int max_(int j, int *array, int &first, int &last);
 4 using namespace std;
 5 #define row 5//行数
 6 #define col 5//列数
 7 int main()
 8 {
 9     srand((int)time(NULL));//随机种子
10     int i, j,a[100][100];
11     int array[100];
12     int max_row[100];
13     int sum=0,max=0;
14     int first_num=0, last_num=0;
15     for (i = 0; i < row; i++)
16     {
17         for (j = 0; j < col; j++)
18         {
19             //从(-100)到100间的随机数给二维数组赋值
20             a[i][j] = rand() %(100-(-100)+1)-100 ;
21         }
22     }
23     cout << "数组为:"<<endl;
24     //显示数组
25     for (i = 0; i < row; i++)
26     {
27         for (j = 0; j < col; j++)
28         {
29             cout << a[i][j]<<" ";
30         }
31         cout << endl;
32     }
33     cout << endl;
34     //------------------------------------------------------------
35     //每一行赋予一个一维数组
36     for (i = 0; i < row; i++)//每一行
37     {
38         for (j = 0; j < col; j++)//每一列
39         {
40             array[j] = a[i][j];
41         }
42         max_row[i]=max_(j, array,first_num,last_num);//求每一行的子数组和的最大值
43         cout << max_row[i] <<" "<< first_num<<" "<<last_num<<endl;
44
45     }
46     return 0;
47 }
48 //求一维数组子数组和的最大值
49 int max_(int j,int *array,int &first,int &last)
50 {
51     int sum = 0, max = 0;
52     for (j = 0; j < col; j++)
53     {
54         sum = sum + array[j];
55         if (sum > max)
56         {
57             max = sum;
58         }
59         if (sum < 0)
60         {
61             sum = 0;
62         }
63         if (max == 0)
64         {
65             sum = sum + array[j];
66             if (sum > max)
67             {
68                 max = sum;
69             }
70         }
71
72     }
73     return max;
74 }

效果截图:

体会:由于主要精力放到了四则运算安卓方面(也没有太多成果),导致本次任务时间有点紧张,思考不够,现在只实现了求每一行子数组和的最大值,遇到瓶颈:由于算法原因起始元素和终止元素的值得确定有点混乱,明天加油,今天脑袋有点乱了,先学会儿别的

时间: 2024-08-09 14:36:49

联通子数组(一)的相关文章

联通子数组最大值设计03

So郁闷,我先把老师提出的问题写出来; 返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.下面是给的示例图: 最近已经完全的陷入了编程的怪圈,自己完全没找到自己的方向吧,废话不多说,直接上问题:在子数组问题上我觉得基本都是一位子数组的变形,应该不会有特别的变化,最多是难度上去,但是基本的思想不会变,今天我发现错了,可能是我错了. 我的想法:在网上看代码找到的灵感:因为觉得老师上课讲的图的方法有些麻烦所以就想还是用一维数组的

返回一个二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 方法一:首先若要对二维数组进行分析,之前我们已经做过关于一位数组的练习,所以我们可以把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的结果就是最大联通子数组的和

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

返回一个二维整数数组的最大联通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求:输入一个二维整形数组,数组里有正数也有负数.求所有子数组的和的最大值. 一.设计思想 先求出这个这个数组中的最大值,并定位,然后找出这个值周围的4个数,联通这4个数中的正数,若全为负数,则查找次大值,并与最大值联通,判断联通前与联通后值得大小,若变小则不联通最大值,若变大则联通最大值,以此类推,直到最大联通子数组怎么联通都比原来的值小.

返回一个最大联通子数组的和

#include<iostream> #include<ctime> using namespace std; #define N 100 typedef struct { int dian[N]; int xian[N][N]; int dianx, xianx; }A; void set(A &shu, int x, int y) { shu.dianx = x*y; srand((unsigned)time(NULL)); for (int i = 1; i <

数组问题(三)求二维整型数组最大联通子数组的和

相较于上次求最大子矩阵的和,这次明显更难了一些. 将问题分解并分析,可以想到 先求各行中的最大子数组,并记录下标,求完之后再将各行的最大子数组的下标进行比较可以得到两种情况 1.上一行的最大子数组下标范围和下一行的最大子数组下标范围有重合的部分. 2.上一行的最大子数组下标范围和下一行的最大子数组下标范围无重合的部分. 程序代码: #include<iostream> using namespace std; int calculate(int n,int a[],int &sm,in

返回一个二维数组中最大联通子数组的和

1 #include <iostream> 2 #include <time.h> 3 #include<string> 4 #include<fstream> 5 #define M 3 6 #define N 4 7 using namespace std; 8 9 int main() 10 { 11 int length[100],num[M][N] = {0},visit[M][N]={0},i=0;//length[100],是把文件中的数组转化

最大联通子数组的和(二)

设计思路同最大联通子数组的和(一)http://www.cnblogs.com/brucekun/p/5356994.html 将(一)未完成的部分做了基本补充,但是还存在bug: ⑴每行最大子数组的和为负数时显示为0(具体算法见http://www.cnblogs.com/brucekun/p/5316601.html) ⑵返回每行最大子数组的起始和最后元素时有时会出错 源代码: 1 #include<iostream> 2 #include<ctime> 3 int max_(

返回二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 第一种方法:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. 第二种方法:在二维整形数组中,数据可

二维数组联通子数组和最大

思路: 这也是根据同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下.开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0:将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最大值即时最大联通子数组的和.遍历时,选取已遍历的联通子数组周围最大值遍历.经过重复的几次遍历就可以确定此数组中最大连通数组和了. 题目要求: 放在一个input.txt的文