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

一.题目

输入一个二维整形数组,数组里有正数也有负数。

求所有子数组的和的最大值。

二.设计思想

第一种方法:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组。再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标。这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到;第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价。最后得到的就是最大联通子数组的和。

第二种方法:在二维整形数组中,数据可能会有正也有负,要求最大值,我们重点关注正数,所以要首先判断二维数组中哪些位置上的数是正数,利用另一个二维数组记录正数的位置,然后判断哪些数是连通的。首先定位这个二维数组中的最大值,然后在分析这个值周围的4个数,联通这4个数中的正数,若全为负数,则查找次大值,并与最大值联通,判断联通前与联通后值得大小,若变小则不联通最大值,若变大则联通最大值,以此类推,直到最大联通子数组怎么联通都比原来的值小。

三.实验代码

#include<iostream>
#include<fstream>
using namespace std;
# define N 100
int zuida(int n, int a[], int *p, int *q)//一维数组的最大子数组和
{
	int b[N] = { 0 };
	int i, sum1 = 0, max1 = 0;
	for (i = 0; i<n; i++)
	{
		if (sum1<0)
		{
			sum1 = a[i];
		}
		else
		{
			sum1 = sum1 + a[i];
		}
		b[i] = sum1;
	}
	max1 = b[0];
	for (i = 0; i<n; i++)
	{
		if (max1<b[i])
		{
			max1 = b[i];
			*q = i;  //记录最大子数组的终点位置
		}
	}
	for (i = *q; i >= 0; i--)
	{
		if (b[i] == a[i])
		{
			*p = i;//记录最大子数组的起点
			break;
		}
	}
	return max1;
}
int main()
{
	int m1, m2, i, j, p, q, t2;
	int sum, max;
	int left[N], right[N], t[N];
	int a[N][N], b[N];
	ifstream fin("sz.txt");
	ifstream fin1("sz1.txt");
	fin1 >> m1 >> m2;
	cout << "二维数组的行和列为"<< endl;
	cout << m1 << "  " << m2 << endl;
	for (int i = 0; i < m1; i++)
	for (int j = 0; j < m2; j++)
	{
		fin >> a[i][j];
	}
	cout << "TXT文件中的二维数组为" << endl;
	for (int i = 0; i < m1; i++)
	{
		for (int j = 0; j < m2; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	for (i = 0; i<m1; i++)//求每一行最大子数组
	{
		for (j = 0; j<m2; j++)
		{
			b[j] = a[i][j];
		}
		sum = zuida(m1, b, &p, &q);
		left[i] = p;     //记录最大子数组的坐标位置
		right[i] = q;
		t[i] = sum;

	}
	t2 = t[0];
	for (i = 0; i + 1<m2; i++)//将最大子数组合并
	{
		if (left[i] <= right[i + 1] && right[i] >= left[i + 1])//两行的最大子数组块相连
		{
			t2 += t[i + 1];
		}
		for (j = left[i]; j<left[i + 1]; j++)
		{
			if (a[i + 1][j]>0)
				t2 += a[i + 1][j];                   //判别独立正数
		}

	}
	cout <<"最大子数组和为:"<< t2 << endl;
	return 0;
}

实验总结:

通过这次试验,我们考虑到了更多的细节问题,由一维数组转换到二维数组,需要更多的考虑。

时间: 2024-10-21 16:49:01

返回二维数组最大联通子数组的和的相关文章

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

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

二维数组中按子数组首个元素值去重

后台更新了算法,用来挖掘数据,前台(我)配合后台搭建了新页面,历时两周,从 0 到 现在的联调完毕,呼呼,有累,但更多的是完成工作后的喜悦. 废话不多说,联调过程中遇到一个接口需要传输二维数组,是关于选择句子,然后将文档号和句子号拼接成数组,再压入大数组来向后台发送要保存的数据的. 而前台在存储时,选择的句子会直接存储其所属文档号,这样底层存储的数组就会变成对象数组: arr = [ {name:***,docNum:0,lineNum:3}, {name:***,docNum:2,lineNu

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

1.设计思想:先用户键盘输入一个自定义的几行几列的矩阵,然后输入相关的值,再调用求二维数组最大联通子数组和的方法,最终输出最大值. 2.出现问题:对于求联通子数组的这个思路不是很懂,不清楚. 3.解决方案:先求每行的最大和最小块,再求总的最大值,再将其输出:当列数为1时,当成一维计算: 4.源代码: /*返回一个整数数组中最大子数组的和. 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.

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

分析 1,开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0: 2,将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值: 3,取以每个点为起点遍历的和的最大值即时最大联通子数组的和.遍历时,选取已遍历的联通子数组周围最大值遍历.经过重复的几次遍历就可以确定此数组中最大连通数组和了. 题目要求: 放在一个input.txt的文件中 数组里面有正数有负数 返回联通子数组和最大的值 #include<fstr

关于返回二维数组指针问题

所谓的二维数组指针,是指针的指针,指的就是二维数组在内存中的存储地址. 二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址).行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义int a[5][5]:则a[0][0]是a数组 首行首列元素(代表该元素的值).而&a[0][0]是首行首元素的地址.&&a[0][0]则是首行的首地址.从这个意义上讲,可以说行的首地址是一种二重地址,即指针的指针. 废

CI codeigniter 查询 db query 返回 二维数组 返回 第一条记录

$r = $this->db->query("SELECT * FROM ych_borrow WHERE user_id=2"); $r->result_array();//返回二位数组 $r->row_array();//返回第一条数据的一维数组

周泊辰和张子涵返回二维数组整数组和

首先了解一维数组的求最大和,可以先列举出一维数组的所有子数组并求出他们的和,即加上一个正的和会增加,反之减少,如果某一个和为负数,那么就应该放弃他,然后清零.然后求二维数组最大子数组的和,可以转化为求一维数组最大子数组的和设一个二维数组a[n][m],找它的 最大子数组之和,先建立一个新的二维数组b[n][m],二维数组b[j][k] 存放的是a[j][k](0<=j2.循环:从a[0][0]开始 以此是 a[0][1]. a[0][2]--a[0][m].a[1][0]. a[1][1]--a

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

程序代码:#include<stdio.h> #define M 5 #define N 4 int maxSubArray(int arr[], int len) { int i, sum = arr[0], b = 0; for (i = 0; i<len; ++i) { if (b>0) b += arr[i]; else b = arr[i]; if (b>sum) sum = b; } return sum; } int maxSubMatrix(int n, in

返回一个随机数组中的子数组中的数相加最大的和(二)

设计思想: 随机生成数组(含有正数与负数). 求所有子数组:按数组长度进行数组的划分(因为要求数组是连续的). 计算:从第一个数开始做加法,若和大于第二个数,则继续加下一个数(若加上第三个数的和大于第三个数,则重复进行此操作:小于第三个数,则舍掉前面所有数,并继续就重复进行此操作):若小于第二个数,则舍掉第一个数. 实现代码: #include <iostream> #include<time.h> using namespace std; int maxSum(int* a, i