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

1 问题:返回一个二维整数数组中最大联通子数组的和

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

3 代码

 1 #include<iostream>
 2 using namespace std;
 3 int zuida(int n,int a[],int *sm,int *mm);
 4
 5 void main()
 6 {
 7     int m,n,i,j,sm,mm,t2;
 8     int sum,max;
 9     int up[100],down[100],t[100];
10     int a[100][100],b[100];
11     cout<<"输入二维数组的行"<<endl;
12     cin>>m;
13      cout<<"输入二维数组的行"<<endl;
14      cin>>n;
15     for(i=0;i<m;i++)
16     {
17         for(j=0;j<n;j++)
18         {
19             cin>>a[i][j];
20         }
21     }
22
23     for(i=0;i<m;i++)
24     {
25         for(j=0;j<n;j++)
26         {
27             b[j]=a[i][j];
28         }
29         sum=zuida(n,b,&sm,&mm);
30         up[i]=sma;
31         down[i]=mm;
32         t[i]=sum;
33
34     }
35     t2=t[0];
36     for(i=0;i+1<m;i++)
37     {
38         if(up[i]<=down[i+1] && down[i]>=up[i+1])
39         {
40             t2+=t[i+1];
41         }
42          for(j=up[i];j<up[i+1];j++)
43         {
44             if(a[i+1][j]>0) t2+=a[i+1][j];                   //判别独立正数
45         }
46
47     }
48      cout<<t2<<endl;
49
50 }
51
52
53 int zuida(int n,int a[],int *sm,int *mm)
54 {
55     int b[100]={0};
56     int i,sum1=0,max1=0;
57     for(i=0;i<n;i++)
58     {
59         if(sum1<0)
60         {
61             sum1=a[i];
62         }
63         else
64         {
65             sum1=sum1+a[i];
66         }
67         b[i]=sum1;
68     }
69     max1=b[0];
70     for(i=0;i<n;i++)
71     {
72         if (max1<b[i])
73          {
74              max1= b[i];
75              *mm = i;
76          }
77     }
78      for (i = *mm;i >= 0;i--)
79     {
80         if (b[i] == a[i])
81         {
82              *sm= i;
83              break;
84         }
85     }
86      return max1;
87 }
88

4 截图

5 总结:我感觉这次题目要比上次题目难,难点就在于使每行最大子数组的相连,因为不是直接相连就能得到最大值,还要进行判断比大小,就像数据结构中的求最短路径问题,使用迪杰斯特拉算法。程序永远都是不同模块的组合,编程时要一步一步的实现每个功能模块,是复杂程序简单化,逐个击破。

时间: 2024-10-07 06:29:27

求二维整数数组中最大联通子数组的和的相关文章

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

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

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

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

结对开发之返回一个二维整数数组中最大联通子数组的和

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

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

题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选).源代码.结果截图.总结. 思想: 在看到本题目后,想了很久也没有想到比较满意的解决方法,觉得题目比较难,超出了我的能力范围.不过,个人认为可能用到了图论的知识,但是学的不好.根据上图给定的二维数组求解最大联通数组也许比较简单.以一个非负

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

设计思想:(1)首先把这个二维数组按行的数目分解为与列数目具有相同数目的一维数组: (2)再分别求出这几个一维数组的最大连续子数组之和,分别记录每一个最大连续数组的首末位置: (3)接着分别比较看这几个一维数组的首末位置是否处于矩阵上相连的位置,找出位置上相连且之和为最大的数组,输出它们的和即可. 源代码: #include<iostream> using namespace std; int Max(int n,int a[],int *smark,int *mmark) { int b[1

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

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

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

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

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.      二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和.      求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求:两人结对完成编程任务.              一人主要负责程序分析,代码编程.              一人负责代码复审和代码测试计划.              发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照)

返回一个二维整数数组中最大子数组的和(头尾相接)

1.题目. 题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思想. 分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵.比较其中最大的子矩阵值,找出最大的. 3.代码. #include<iostream> using namespace