首尾相连的二维数组求最大字数组的和

题目:

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

要求:

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

二维数组首尾相接,象个一条首尾相接带子一样。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

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

思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用。

(1)代码:

#include<iostream>
using namespace std;
#define N 4

void maxhe(int a[],int &s,int &jmin,int &jmax)
{
    int sum=a[0],b=a[0],x=0,y=0;
    int    j=1;
    while((j-x<N)&&x<N) 
    { 
        if(b>=0)         
        {
            b=a[j%N];
            if(j<N)
                x=j;
            else
                break;
        } 
        else 
            b+=a[j%N]; 
        if(sum>=b) 
        { sum=b;y=j;} 
        j++;
    }
    sum=0;
    for(int i=y+1;i<x+N;i++)
        sum+=a[i%N];
    s=sum;jmin=y+1;jmax=x+N-1;
    int z=y%N;
    if(x>=z)
    {
        j=1;sum=a[0];b=a[0];x=0;y=0;
        while(j<N) 
        { 
            if(b<0)         
            { b=a[j%N];x=j;} 
            else 
                b+=a[j%N]; 
            if(sum<=b) 
            { sum=b;y=j;} 
            j++;
        }
       
        s=sum;jmin=x;jmax=y;
    }
    else if((x==0)&&(y==(N-1)))
    {
        sum=a[0];b=a[0];x=0;y=0;
        for(int o=1;o<N;o++)
        {
            if(a[o]>sum)
            {sum=a[o];x=o;y=o;}
        }
        s=sum;jmin=x;jmax=y;
    }
}

int main()
{
    int a[N][N];
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            a[i][j]=rand()%6;
            if(rand()%2==1)
                a[i][j]=a[i][j]*(-1);
        }
    }
    cout<<"随机生成的二维数组为:"<<endl<<endl;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            cout<<a[i][j]<<"  ";
        }
        cout<<endl;
    }///////////////////////////////////////////////二维数组生成
   
   
    int max=a[0][0],c1=0,c2=0,l1=0,l2=0;
    for(int i=0;i<N;i++)
    {
        for(int j=i;j<N;j++)
        {
            int b[N]={0};////////////////定义可以存放各行相加和的数组
            for(int k=0;k<N;k++)
            {
                for(int l=i;l<=j;l++)
                {
                    b[k]+=a[l][k];
                }
                cout<<b[k]<<" ";

int s=b[0],jmin=0,jmax=0;
                maxhe(b,s,jmin,jmax);
                if(s>=max)
                {max=s;c1=jmin;c2=jmax;l1=i;l2=j;}
            }
            cout<<endl;
        }
    }

cout<<"二维数组最大和为:"<<max<<endl;
    for(int i=l1;i<=l2;i++)
    {
        for(int j=c1;j<=c2;j++)
        {
            cout<<a[i][j%N]<<"  ";
        }
        cout<<endl;
    }
}

时间: 2024-12-18 19:37:03

首尾相连的二维数组求最大字数组的和的相关文章

首尾相连的二维数组最大子数组求和

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

二维环形数组求最大子数组和

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

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制

循环一维数组求最大子数组

题目: 随机出一个一维数组,设该数组为循环数组,求其最大小子数组. 一.设计思路 求最大子数组,就求出最大的连续正子数组. 将数组分为全负和有非负值两种情况.全负求出最大值即可. 在有非负值的情况下,先判断该随机数组的首尾是否相连,即首尾是否都大于等于零.如果首尾相连,则将该一维数组分为首.中.尾三部分,先求出首尾和S1,再求中间最大连续正子数组和S,令S1和S与maxS相比较,求出最大子数组:如果首尾不相连,则直接借鉴前一种情况中部的算法,求最大正子数组S. 二.源代码 1 //刘双渤,刘洪阳

一维数组求最大子数组(解决溢出问题)

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 程序在宏里面定义出了数组长度的大小,在长度超过100万的时候程序直接崩溃,其实这并不是因为结果太大导致的数值溢出,而是因为内存溢出,我们的数组是定义在程序内部的,属于局部变量,存放位置在栈上

环数组求最大子数组的和

在结对开发的过程中,每个人分担不同的任务,由于我们在学习阶段,所以我自己也编写了一段小程序,但是总是缺少一个限制条件,让这段代码停下来,下面这段代码是我的同伴编写的,我只是做了一个测试. #include<iostream> using namespace std; void main() { int length; //数组的个数 int n; //数组变化后的长度 cout<<"请输入数组元素个数:"<<endl; cin>>leng

环形数组求最大子数组之和

环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一种为数组中存在正数情况,一种为全部为负数的情况: 在存在正数的情况中又可分为三种情况,一种为全部为正数的情况,一种为自设的头元素为正数,最后一种为自设的头元素为负数.根据这几种情况分类进行实现. 在实现过程中,对数组元素从头到尾进行遍历,如果遇到正数即用和相加,直到相邻的下一个为负数,即存放目前该最

剑指Offer(Java版)第四十题:在数组中的两个数字,如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。 并将P对1000000007取模的结果输出。 即输出P%1000000007

/*在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 */ import java.util.*; public class Class40 { public int InversePairs(int[] array){ int length = array.length; int P = 0; for(int i = 0; i < lengt

二维数组和最大字数组求取 2

题目: 返回一个二维数组的和最大字数组的和 要求: 随机生成二维数组,要求数组元素有正有负 二维数组首尾相连 数组中连续的n(n>=1)元素组成数组的字数组 源代码: import java.util.Random; import java.util.Scanner; public class erweixunhuanzishuzu { public static void main(String[] args) { //产生随机数组 int array[][] = new int[1000][