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

设计思想:

首先肯定是把二维转化为一维数组来比较,这样,先从第一行开始,把第一行看成是一维数组选出最大子数组具体实现是,设子数组和为sum=0,另设b=0,a[0][i]从a[0][0]开始检索当b<0时b=a[0][i]否则b=b+a[0][i]只有当b>sum时sum=b,(首先保证sum的初次赋值是大于0然后就是对b的操作首次出现正数时赋给b此时sum=0,b>sum,所以sum=b,然后继续上一步对b的正负性的判断分解为,开始由上一步b>0所以b=b+a[0][i],若a[0][i]>0,b增大sum<b,sum=b,若a[0][i]<0,b减小不执行sum=b,下一步如何执行看上一步b的结果如此是保持数组积累当前数组大于0则可以继续和后面的子数组相加因为还可能出现包含它的更大的子数组,若b小于0说明它会累赘后面的子数组直接舍弃从新开始加数组就可以),第二步将第一行与第二行相加将和赋给新的数组的第二行重复上一步不同的是 此时的sum初值为第一行的最大子数组的和,这样一直加到最后一行再从第二行开始然后再从第三行开始直到最后一行就能找出最大子数组的和。

源代码:

#include<iostream>
using namespace std;
void max(int row,int col)
{

int ** a=new int*[row];
 int ** b=new int*[row];
 for(int i=1;i<=row;i++)
 {
  a[i]=new int[col];
 }
 for(int i=1;i<=row;i++)
 {
  b[i]=new int[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++;
   }
  }
 }
 cout<<"所输入的数组为:"<<endl;
 for(int i=1;i<=row;i++)
 {
  for(int j=1;j<=col;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<=col;j++)
  {
   b[i][j]=a[i][j];
     }
    }
  for(int i=m;i<=row;i++)
    {
  while(k<=i)
  {
    for(int j=1;j<=col;j++)
   {
    b[k][j]=b[k-1][j]+b[k][j];
    cout<<b[k][j]<<" ";
   }
    k++;
  }
   }
  n++;
   for(int i=m;i<=row;i++)
   {
    int c=0;
  for(int j=1;j<=col;j++)
  {
             if(c<0)
   {
    c=b[i][j];
   }
   else
   {
   
    c=c+b[i][j];
   }
         if(sum<c)
   {
    sum=c;
   }
  }
  }
 }
    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;i++)
 {
  delete []a[i];
  a[i]=NULL;
 }
 for(int i=1;i<=row;i++)
 {
  delete []b[i];
  b[i]=NULL;
 }
}
void main()
{
 int row,col;//行和列数
  cout<<"请输入数组的行数和列数:";
 cin>>row>>col;
 max(row,col);
}

屏幕截图:

个人总结:

首先是未能达到时间复杂度是o(n)的要求,设计思想很重要,有了思想可以决定自己是否可以用代码完成以及以何种方式完成,看到题目要有总体解决方法的思想,并且在此基础上不断完善思想,而不是惊世些天马行空的想法但不实现或者实现不了,总结从这道题得到的解决问题思路的方法,首先应该直到如何用最笨的方法解决就是一个一个个算出来,然后把复杂的简化比如二维转换为一维,把规律性的用变量换。还有就是发现了程序能运行但是运行完报错是数组大小的问题已解决。

时间: 2024-10-07 05:45:32

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

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

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

二维数组求最大连通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数. 源程序 /* 设计思路: 1.首先从文件读入一个二维整型数组(有正有负): 2.从数组中选出最小的一个数,如果为负数则除去,检验联通性: 3.联通,接下来找剩余中最小的数,

软件工程结对开发之求二维数组中连续最大子数组之和2

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 先调用以前求二维最大连续子数组之和的maxSubArray函数求一个首尾不相邻的二维最大连续子数组之和,接着用将第k列各元素左移一列可以再求一个最大连续子数组之和 ,循环m次(因为原二维数组有m列)求得每个

体验结对开发的乐趣(5)--(首尾相连的二维数组求最大子数组和的问题)

结对伙伴:信1201-2班高扬.信1201-1班韩雪东 一.题目要求与设计思想 题目要求:在上一次的基础上把数组变为二维数组,然后首尾相接,形成连环,然后求和最大的子数组: 设计思想:一维数组首尾相连的问题已经得到解决,二位数组求和最大的子数组的问题也已经解决了,就是把这两个程序思想融在一起,然后在短短的时间内就完成了这次课堂项目. 二.源代码 1 // erweishuzuqiuzuida.cpp : Defines the entry point for the console applic

php 二维数组传递给 js 问题解决记录

需求: php从数据库中读取到二维数组.传递到js中 实现步骤: php:json_encode  →   json  →  js:eval 即在php中使用json_encode()将php的二维数组转化成json格式.传递到js中,使用eval()解析得到js的二维数组. 代码: php: <?php header("Content-Type: text/html; charset=utf8") ; $con=mysqli_connect("url",&q

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

#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+=

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

题目: 返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用. (1)代码: #include<iostream>using namespace std;#define N 4 void m

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

#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

二维数组子数组最大和

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