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

设计思路同最大联通子数组的和(一)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_(int j, int *array, int &first, int &last);
  4 using namespace std;
  5 #define row 3//行数
  6 #define col 3//列数
  7 int main()
  8 {
  9     srand((int)time(NULL));//随机种子
 10     int i, j,a[100][100];
 11     int fir[100];//存放起始元素
 12     int la[100];//存放最终元素
 13     int array[100];
 14     int max_row[100];
 15     int M[100];
 16     int MAX = 0;
 17     int first_num=0, last_num=0;
 18     for (i = 0; i < row; i++)
 19     {
 20         for (j = 0; j < col; j++)
 21         {
 22             //从(-100)到100间的随机数给二维数组赋值
 23             a[i][j] = rand() %(100-(-100)+1)-100 ;
 24         }
 25     }
 26     cout << "数组为:"<<endl;
 27     //显示数组
 28     for (i = 0; i < row; i++)
 29     {
 30         for (j = 0; j < col; j++)
 31         {
 32             cout << a[i][j]<<" ";
 33         }
 34         cout << endl;
 35     }
 36     cout << endl;
 37     //------------------------------------------------------------
 38     //每一行赋予一个一维数组
 39     for (i = 0; i < row; i++)//每一行
 40     {
 41         for (j = 0; j < col; j++)//每一列
 42         {
 43             array[j] = a[i][j];
 44         }
 45         max_row[i]=max_(j, array,first_num,last_num);//求每一行的子数组和的最大值
 46         cout << max_row[i] << endl;//每行最大元素
 47         cout << "首元素" << first_num + 1 << endl;
 48         cout<< "尾元素" << last_num + 1 << endl;
 49         //判断每行是否有联通的数
 50
 51     }
 52     for (i = 0; i < row; i++)
 53     {
 54         if (a[i][last_num]>=a[i + 1][first_num]||a[i][first_num]<=a[i+1][last_num])
 55         {
 56             M[i] = max_row[i] + max_row[i+1];
 57             if (M[i]>MAX)
 58             {
 59                 MAX = M[i];
 60             }
 61         }
 62     }
 63     cout << "最大联通子数组的和为:" << MAX;
 64     return 0;
 65 }
 66 //求一维数组子数组和的最大值
 67 int max_(int j,int *array,int &first,int &last)//first、last为起始元素和最终元素位置
 68 {
 69     int sum = 0, max = 0,c[100];
 70     for (j = 0; j < col; j++)
 71     {
 72         sum = sum + array[j];
 73         c[j] = sum;
 74         if (sum < 0)//和为正数时
 75         {
 76             sum = 0;
 77         }
 78         if (sum > max)
 79         {
 80             max = sum;
 81             if (max == 0)//和为负数时
 82             {
 83                 sum = sum + array[j];
 84                 if (sum > max)
 85                 {
 86                     max = sum;
 87                 }
 88             }
 89         }
 90         if (c[j - 1] < 0 )
 91         {
 92             first = j;
 93         }
 94         if (c[j] == max)
 95         {
 96             last = j;
 97         }
 98     }
 99     return max;
100 }

结果截图:

总结:

在写(一)时,有一种惧怕心理,心理感觉这次题目很难实现,也没能静下心来写,今天静下心想方法以后比预期要提高不少,越来越发现人在思考的时候是人生最闪亮的时刻之一

时间: 2024-08-11 04:09:33

最大联通子数组的和(二)的相关文章

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

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

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

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

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

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

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

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],是把文件中的数组转化

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

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

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

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

求二维整数数组中最大联通子数组的和

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

返回一个二维整数数组中最大联通子数组的和(思路)

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

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

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