最大子数组三

一、题目及要求:

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

输入一个二维整形数组,数组里有正数也有负数;二维数组首尾相接,像一条首尾相接的带子一样。

二、设计思路:

这个题目其实与上次毫无区别,仍然调用循环一维数组求最大子数组的函数,将二维数组列的情况全

部列出,即转化为一维数组。a[0][0],a[0][0]a[0][1]........。在调用函数即可。

三、源代码

  1 #include<iostream.h>
  2 int max2(int arry[],int length)  //跨越arry[n-1]、arry[0]的最大和
  3 {
  4     int total=0;
  5     int sum=arry[0];
  6     int minsum=arry[0];
  7     for(int i=1;i<length;i++)
  8     {
  9         if(sum>0)
 10         {
 11             sum=arry[i];
 12         }
 13         else
 14         {
 15             sum=sum+arry[i];
 16
 17         }
 18         if(minsum>=sum)
 19         {
 20             minsum=sum;
 21         }
 22         total=total+arry[i];
 23     }
 24     total=total+arry[0];
 25     minsum=total-minsum;
 26
 27     return minsum;
 28 }
 29
 30
 31 int max1(int arry[],int length)   //不跨越零点的最大和
 32 {
 33     int sum=arry[0];
 34     int maxsum=arry[0];
 35     for(int i=1;i<length;i++)    //求出相邻数组最小和
 36     {
 37         if(sum<0)
 38         {
 39             sum=arry[i];
 40         }
 41         else
 42         {
 43             sum=sum+arry[i];
 44
 45         }
 46         if(maxsum<=sum)
 47         {
 48             maxsum=sum;
 49         }
 50     }
 51     //struct ret ret1={maxsum,start2,end};
 52     return maxsum;
 53 }
 54 int column(int a[][20],int length,int num1) //求最大和
 55   {
 56       int y=0;
 57       int d[20];
 58       int e[100];
 59       int c[100][20];
 60       c[0][0]=0;
 61       int p=0;
 62       int b[100]={0};
 63       for(int j=0;j<num1;j++)
 64       {
 65           for(int t=j;t<num1;t++)
 66           {
 67               for(int i=0;i<length;i++)
 68               {
 69                   b[i]=b[i]+a[t][i];
 70                   c[p][i]=b[i];
 71               }
 72               p=p+1;
 73           }
 74           for(int o=0;o<100;o++)
 75           {
 76               b[o]=0;
 77           }
 78       }
 79       for(int l=0;l<p;l++)
 80       {
 81
 82           for(int u=0;u<length;u++)
 83           {
 84               d[u]=c[l][u];
 85               //cout<<d[u]<<"  ";
 86           }
 87           e[y++]=max1(d,length);
 88           e[y++]=max2(d,length);
 89           //cout<<e[y-1]<<"  ";
 90       }
 91       int Max=e[0];
 92       for(int i=0;i<y;i++)
 93       {
 94
 95           if(e[i]>=Max)
 96          {
 97              Max=e[i];
 98             }
 99          }
100       return Max;
101 }
102  int main()
103 {
104      int a[20][20];
105      int length,index;
106
107      cout<<"输入行数列数:";
108      cin>>index>>length;
109
110      int y=0;
111      for(int i=0;i<index;i++)
112      {
113          for(int j=0;j<length;j++)
114          {
115              cin>>a[i][j];
116          }
117      }
118
119      int s=column(a,length,index);
120      cout<<"最大和为:"<<s<<endl;
121      return 0;
122  }

四、截图

五、感想

  对于这次实验仅简单的调用了上次函数,用时很少。不过这次我领航,没有书写任何代码,当看到伙伴再写代码

时,似乎看到自己最容易犯的错,例如大括号,即等号与赋值号。当他写代码时,也比只看着更有感觉,交换一下

位置原来可以看到的更多。也许,好像这是最后一次结对开发,在此,感想一直相互合作的队友,亦是兄弟。

结对开发伙伴:胡金辉  http://www.cnblogs.com/hujinhui/

时间: 2024-10-14 00:43:09

最大子数组三的相关文章

三种方法求最大子数组的和

这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8. 下面按照时间复杂度逐步优化的顺序依次给出这三种算法. 暴力求解法 该方法的思想非常简单,先找出从第1个元素开始的最大子数组,而后再从第2个元素

3月27号周五课堂练习:结对开发----返回一个整数数组中最大子数组的和三

一.题目要求 1.1输入一个整形数组,数组里有正数也有负数. 1.2数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.3如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 1.4同时返回最大子数组的位置. 1.5求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 三.源代码 #include<iostream> #include<time.h> #include<conio

返回一个整数数组中最大子数组的和(三)--环形

这次,在上次的要求中又多了一个条件 ——要求这个数组是环形的. 在上次的基础上,将这个代码进行改进,得到以下结果.下面把代码贴出来. 1 package yiweishuzu; 2 3 import java.util.Scanner; 4 5 public class shuzu_3 { 6 private static Scanner scan; 7 8 public static void main(String[] args) { 9 // 确定元素的个数 10 System.out.p

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

分治策略 &nbsp; 最大子数组问题

递归式 递归式与分治方法是紧密相关的,因为使用递归式可以很自然地刻画分治算法的运行时间.一个递归式就是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数.例如,在2.3.2节,我们用递归式描述了MERGE-SORT过程的最坏情况运行时间T(n): Θ(1)        若n=1 T(n) =                         (4.1) 2T(n/2)+Θ(n)    若n>1 求解可得T(n)=Θ(nlgn) 递归式可以有很多形式.例如,一个递归算法可能将问题划分为规模

最大子数组问题

小渣今天再来更新一波,欢迎看众 老爷们尽情喷(批评指导) 何为最大子数组:简言之,就是一数组A[n]中从i到j的连续子序列(i,j均在(0,n)区间内),且不存在另一对(a,b)对使得A[a]+A[a+1]+.....A[b]>A[i]+A[i+1]+...+A[j] 可见:①只有在数组含有负数元素时这个问题才有探讨的价值,否则整个数组本身即是最大子数组了: ②并且,i<=j(最大子数组可能只含有一个元素) ③最大子数组可能不唯一 思路:按照二分法来做,最大子数组两端无非有三种情况: 在左半部

结对开发——返回整数数组最大子数组和2

返回整数数组最大子数组和2 为了实现“敏捷开发”的目的,老师让我们采取“迭代”的方法进行项目的开发,这不,对于周一的求最大子数组和又有了新的要求,如下: 1.延续上次的要求,这里不再赘余… 2.如果数组A[0]……A[j-1]首尾相连,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大: 3.同时返回最大子数组的位置: 4.要求程序必须能处理1000 个元素,且每个元素是int32 类型的. 一.实验设计思路 首先实现的是数组首尾相连,先存入数组,再将原数组反向存储形成环形数组

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

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

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