联通子数组最大值设计03

So郁闷,我先把老师提出的问题写出来;

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

要求:

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

求所有子数组的和的最大值。下面是给的示例图:

最近已经完全的陷入了编程的怪圈,自己完全没找到自己的方向吧,废话不多说,直接上问题:在子数组问题上我觉得基本都是一位子数组的变形,应该不会有特别的变化,最多是难度上去,但是基本的思想不会变,今天我发现错了,可能是我错了。

我的想法:在网上看代码找到的灵感:因为觉得老师上课讲的图的方法有些麻烦所以就想还是用一维数组的方法AC。开始就是找二维数组中每个一维数组的最大子数组的起始点,然后看能否联通,能联通就直接相加,不能连就去找一条能联的路径,最后加一种特殊的情况,就好了。然而到了真正重新考虑这个模糊的找一条代价最小的路径,我茫然了,这还是需要用图来解决吧。先把代码贴出来,后面一定把问题完善一下,如果有好的建议就请@我,谢谢。

#include<iostream>
using namespace std;

void max_place(int row,int &max,int fl[],int &start,int &end);

int main()
{
	int a[100][100];
	int fl[100];
	int hang=0,lie=0;
	int start_k[100],end_k[100];    //定义二维数组中每一次起始终止位置
	int large[100];
	int max=0;
	int start=0,end=0;    //位置参数
	cout<<"请输入数组行列数:"<<endl;
	cin>>hang>>lie;
	 int i=0,j=0;
	for(i=0;i<hang;i++)
		for(j=0;j<lie;j++)
		{
			cin>>a[i][j];
		}

	 for(i=0;i<hang;i++)
		{
			for(j=0;j<lie;j++)
		{
			cout<<a[i][j]<<" ";
		}
			cout<<endl;
	 }

		//对于数组找到最大联通数组的和
		for(i=0;i<hang;i++)
		{

			for(j=0;j<lie;j++)
			{
				fl[j]=a[i][j];

			}
			max_place(lie,max,fl,start,end);

			cout<<"开始位置:"<<start<<" "<<end<<endl;
			cout<<"最大值为:"<<max<<endl;
			start_k[i]=start;
			end_k[i]=end;
			large[i]=max;
		}

		int max2=large[0];
		//找到连同数组的情况:分情况讨论
		for(i=0;i<hang-1;i++)
		{
			//若上下数组行联通
			if((start_k[i+1]<=end_k[i])&&(start_k[i]<=end_k[i+1]))
			{
				max2+=large[i+1];
			}
			//上下不联通考虑最小代价
			//第一行在第二行右边
			if(start_k[i]>=end_k[i+1])
			{
				int p=large[i+1]+large[i];
				int r1=0,r2=0,r=0;
				//两种判断
				for( j=end_k[i+1]+1;j<=start_k[i];j++)
				  r1+=a[i][j];
				for( j=end_k[i+1]+1;j<start_k[i];j++)
				  r2+=a[i][j];

				r2=r2+a[i][end_k[i+1]+1];
				r=r1;
				if(r2>r1)
					r=r2;

				if(p+r>p)
				max2=max2+p+r;
			}
			//第一行在第二行左边
			if(start_k[i+1]>=end_k[i])
			{
				int p=large[i+1]+large[i];
				int r=0;
				for( j=end_k[i]+1;j<start_k[i+1];j++)
				  r+=a[i][j];
				for( j=end_k[i+1]+1;j<start_k[i+1];j++)
				  r+=a[i][j];

				if(p+r>p)   //如果存在更新判断域
				max2=max2+p+r;
			}
			//单独正数的情况
			for(j=start_k[i];j<start_k[i+1];j++)
			{
				if(a[i+1][j]>0)
					max2+=a[i+1][j];
			}
		}
		cout<<"最大值为"<<max2<<endl;
	return 0;
}

//找到二维数组中每一行最大的值的起始位置
void max_place(int row,int &max,int fl[],int &start,int &end)
{
	//求每个一维数组的最大值
	int b[100]={0},s=0;   //存放最大值
	//finding
	for(int i=0;i<row;i++)
	{
		if(s>=0)
		{
			s+=fl[i];
		}
		else
		{
			s=fl[i];
		}
		b[i]=s;
	}

	//
	int max_num=b[0];
	for(int i=0;i<row;i++)
	{
		if(b[i]>max_num)
		{
			max_num=b[i];
			end=i;     //末位置
		}
	}

	for(int i=end;i>=0;i--)
	{
		if(fl[i] == b[i])
		{
			start=i;    //找到首位置
		   break;
		}
	}
	max=max_num;   //返回最大值
}

  

  近期完善,谢谢

时间: 2024-10-17 07:18:06

联通子数组最大值设计03的相关文章

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

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

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

题目:返回一个二维整数数组中最大联通子数组的和. 要求:输入一个二维整形数组,数组里有正数也有负数.求所有子数组的和的最大值. 一.设计思想 先求出这个这个数组中的最大值,并定位,然后找出这个值周围的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 <

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

设计思路同最大联通子数组的和(一)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 #include<iostream> 2 #include<ctime> 3 int max_(int j, int *array, int &first, int &last); 4 using namespa

子数组最大值02

合作过程:     由于上次作业设计思想不同,经过讨论采用了统一的设计思想.对于这次的作业我们一起进行讨论,我们统一利用二维数组完成一维数组的循环求子数组.我负责进行编码,丽萍负责进行代码的审查和代码的测试. 设计思想: 基于上次不循环一维数组求子数组的最大值. 1.将一维数组转化为二维数组,变相将其转化为循环.即二维数组每一行使一维数组依次向前移动一个数. 2.利用上次思想一次求出每行子数组的最大值. 2.1.定义两个数s,max用来更新子数组的最大值,从数组data[]的data[n-1]开

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

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

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

结对伙伴: 纪烈翔 博客名:我们都是小怪兽 链接: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