返回一个二维数组最大矩阵的和

设计思想:

首先肯定是把二维转化为一维数组来比较,这样,先从第一行开始,把第一行看成是一维数组选出最大子数组具体实现是,设子数组和为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-05 05:11:36

返回一个二维数组最大矩阵的和的相关文章

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

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 两人结对完成编程任务.一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月21日24:00) 二.设计思路 本次实验设计思路非常简单,就

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

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

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

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

课堂练习;返回一个二维数组中最大子数组的和

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

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

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

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

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

返回一个二维整数数组中最大子数组的和(圆柱形)

题目: 返回一个二维整数数组中最大子数组的和 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 组员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路: 本次的任务是二维数组的环状求最大子数组,结合前两次的开发经验我们把一维数组环状的思路继续在二维数组中使用,首先输入数组时令数组的列扩大一倍,也就是令数组后的数组长度的值与前边的数

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

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

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

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