博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
返回一个二维数组最大矩阵的和
阅读量:4930 次
发布时间:2019-06-11

本文共 2031 字,大约阅读时间需要 6 分钟。

设计思想:

首先肯定是把二维转化为一维数组来比较,这样,先从第一行开始,把第一行看成是一维数组选出最大子数组具体实现是,设子数组和为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)的要求,设计思想很重要,有了思想可以决定自己是否可以用代码完成以及以何种方式完成,看到题目要有总体解决方法的思想,并且在此基础上不断完善思想,而不是惊世些天马行空的想法但不实现或者实现不了,总结从这道题得到的解决问题思路的方法,首先应该直到如何用最笨的方法解决就是一个一个个算出来,然后把复杂的简化比如二维转换为一维,把规律性的用变量换。

转载于:https://www.cnblogs.com/yuntianblog/p/4412380.html

你可能感兴趣的文章
有表格的九九乘法表
查看>>
WPF 4 DataGrid 控件(自定义样式篇)
查看>>
改善C#程序的建议1:非用ICloneable不可的理由
查看>>
PHP的错误机制总结
查看>>
window.location
查看>>
C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)
查看>>
使用Flex图表组件
查看>>
官网分析(英雄传奇)(如何设计网站前端)
查看>>
SSH Key的生成和使用(for git)
查看>>
html5--6-52 动画效果-过渡
查看>>
调查表与调查结果分析
查看>>
Windows系统下安装MySQL详细教程(命令安装法)
查看>>
PHP实用小程序(六)
查看>>
PDFsharp Samples
查看>>
django-cms 代码研究(八)app hooks
查看>>
peewee Model.get的复杂查询
查看>>
IE浏览器兼容性设置的一些问题
查看>>
SQL Server复制入门(二)----复制的几种模式
查看>>
javascript 简单认识
查看>>
tomcat 系统架构与设计模式 第二部分 设计模式 转
查看>>