二维数组成环最大和的子数组的和

设计思想:综合了前面一维数组成环和二维数组求最大子数组的思想。

屏幕截图:

总结:

把做过的程序封装成一个个的接口,当使用时直接调用即可。

源代码:

//jiangzhongxi 2015/4/16
#include<iostream>
using namespace std;
void max(int row,int col)
{

int ** a=new int*[row+1];
    int ** b=new int*[row+1];
    int h;//用于每一个一维数组上已经相加元素的个数够一个环则开始下一个
    for(int i=1;i<=row;i++)
    {
        a[i]=new int[2*col];
    }
    for(int i=1;i<=row;i++)
    {
        b[i]=new int[2*col];
    }
    cout<<"请输入"<<row<<"行"<<col<<"列的数组的元素"<<endl;

int count=0;
    for(int i=1;i<=row;i++)
    {
        for(int j=1;j<=col;j++)
        {
            cin>>a[i][j];
            b[i][j]=a[i][j];
            if(a[i][j]<0)
            {
                count++;
            }
        }
    }
    for(int i=1;i<=row;i++)//将二维数组加倍成环
    {
        for(int j=col+1;j<=2*col-1;j++)
        {        
            a[i][j]=a[i][j-col];
        }
    }
    /*cout<<"所输入的数组为:"<<endl;
    for(int i=1;i<=row;i++)
    {
        for(int j=1;j<=2*col-1;j++)
        {        
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }*/
    int k,n=2;
    if(count<row*col)//即不是所有的元素都是负数的情况
    {
        int sum=0;
      for(int m=1;m<=row;m++)
      {
        k=n;
        for(int i=1;i<=row;i++)
       {
         for(int j=1;j<=2*col-1;j++)
        {
            b[i][j]=a[i][j];
        }
       }//b[i]是经过元算后的数组而a[i]用于保留原数组
        for(int i=m;i<=row;i++)
       {
        while(k<=i)//只有在行数大于等于2时才出现两行相加
        {
          for(int j=1;j<=2*col-1;j++)
         {
                b[k][j]=b[k-1][j]+b[k][j];
         }
          k++;
        }
      }
        /*cout<<"b"<<endl;
        for(int i=1;i<=row;i++)
       {
         for(int j=1;j<=2*col-1;j++)
        {
            
            cout<<b[i][j]<<" ";
        }
        cout<<endl;
       }*/
        n++;
        
     for(int i=m;i<=row;i++)
      {
          int c=0;
          h=1;
          while(h<=col)
          {
           for(int j=h;j<=col-1+h;j++)
           {
             if(c<0)
            {
                c=b[i][j];
            }
            else
            {
            
                c=c+b[i][j];
            }
           if(sum<c)
           {
             sum=c;
           }
           //cout<<sum<<"  ";
          }
          h++;
          c=0;//一圈结束c清零sum保持
         }
        
     }
    }
    cout<<endl;
    cout<<"最大子数组的和为:"<<sum;
    }
    else
    {
        int sum=a[1][1];
    
       for(int i=1;i<=row;i++)
      {
        for(int j=1;j<=col;j++)
        {
           if(a[i][j]>sum)
           {
               sum=a[i][j];
           }
        }
      }
              cout<<endl;
    cout<<"最大子数组的和为:"<<sum;
    }
    for(int i=1;i<=row+1;i++)//删除动态数组
    {
        delete []a[i];
        a[i]=NULL;
    }
    for(int i=1;i<=row+1;i++)//删除动态数组
    {
        delete []b[i];
        b[i]=NULL;
    }
}
void main()
{
    int row,col;//行和列数
     cout<<"请输入数组的行数和列数:";
    cin>>row>>col;
    max(row,col);
}

时间: 2024-10-19 18:05:23

二维数组成环最大和的子数组的和的相关文章

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

#include<iostream> using namespace std; void max(int row,int col) { int ** a=new int*[row+1]; int ** b=new int*[row+1]; int h;//用于每一个一维数组上已经相加元素的个数够一个环则开始下一个 for(int i=1;i<=row;i++) { a[i]=new int[2*col]; } for(int i=1;i<=row;i++) { b[i]=new i

Task 4.5 求二维数组中的最大连通子数组之和

任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下.开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0:将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最

输出一个数组中最大和的子数组并且和不溢出

组员 石鹤李海超 一.题目 输出一个数组中最大和的子数组,数组为int32型,有1000个数,保证最大子数组的和不溢出. 二.设计思想 随机产生一千个数的数组,求最大子数组和的过程中判断是否溢出,如果溢出,则输出溢出. 三.源代码 #include<iostream.h> long MAX(unsigned long arry[],int length) { unsigned long sum=arry[0]; unsigned long maxsum=arry[0]; for(int i=1

结对开发——求环形二维数组最大子矩阵和的问题

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 1 #include "stdafx.h" 2 #include<i

实例13_求解二维数组的最大元素和最小元素

实例说明: 看完题,我觉得作者应该就是让我输出一个数组中最大的数字和最小的数字吧,于是开始写了. 1.先给数组赋值 2.然后遍历数组,通过中间值,选出最大的和最小的. 1 /** 2 * Copyright (c) 1991 - 2016 Arvin Tang. 3 * All rights reserved. 4 * 5 * 文件名称:实例13 6 * 简要描述:求解二维数组的最大和最小元素 7 * 8 * 当前版本:1.0 9 * 作 者: 10 * 完成日期:2016-1-7 11 * 修

二维数组子数组最大和

1.结组成员 周盼超.张晨建 2.实现功能 随机产生一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 3.设计思路 我感觉,这应该是最笨的方法了吧,我们用了用了四个for嵌套.思路很简单:每一行每一行的求最大子数组和即看成n个一维子数组求最大子数组和,记录结果,然后把两行看做一行上下两个数相加,每两行两行求最大子数组和,然后三行,四行,n行. 4.完整代码 package 二维数组; import java.u

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

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

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

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

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

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