任务:输入一个二维整形数组,数组里有正数也有负数。 求所有子数组的和的最大值。要求时间复杂度为O(n)。

1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下。开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0;将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最大值即时最大联通子数组的和。遍历时,选取已遍历的联通子数组周围最大值遍历。经过重复的几次遍历就可以确定此数组中最大连通数组和了。

2.源代码:

#include<iostream>
#define N 100
#include<ctime>
using namespace std; typedef struct
{
int d[N];
int a[N][N];
int x;
}A; void set(A &shu, int x, int y)//x,y分别是行数和列数
{
shu.x = x*y;
srand((unsigned)time(NULL));
for (int i = ; i <= shu.x; i++)
{
shu.d[i] = rand() % ;
if (rand() % == )
shu.d[i] = shu.d[i] * (-);
}//随机生成数组的数
for (int i = ; i <= shu.x; i += y)
{
for (int j = i; j <= i + y - ; j++)
{
shu.a[j][j + ] = ;
shu.a[j + ][j] = ;
}
}
for (int i = + y; i<shu.x; i += y)
{
for (int j = i; j <= i + x - ; j++)
{
shu.a[j][j - y] = ;
shu.a[j - y][j] = ;
}
}//将随机生成的一维数组转换成二维的图的形式
}
void output(A shu)
{
for (int i = ; i <= shu.x; i++)
{
cout << shu.d[i] ;
if (shu.a[i][i + ] == )
cout << " ";
else
cout << endl;
}
}
void bianli(A &shu, int v, int visit[], int &b, int &max, int x)
{
visit[v] = ; max += shu.d[v];
if (max >= b)
b = max; int a = , bo = ;
for (int w = ; w <= shu.x; w++)
{
for (int c = ; c <= shu.x; c++)
{
if ((visit[w] == ) && (shu.a[c][w] == ) && (visit[c] == ))
{
a = w; bo = ; break;
}
}
if (bo == )
break;
}
for (int w = ; w <= shu.x; w++)
{
for (int c = ; c <= shu.x; c++)
{
if ((visit[w] == ) && (shu.a[c][w] == ) && (visit[c] == ))
{
if (shu.d[a]<shu.d[w])
a = w; }
}
}
if (b + shu.d[a]<)
{
shu.a[v][a] = ;
}
else
bianli(shu, a, visit, b, max, x);
}
//遍历 int NoVisit(int visit[], A shu)
{
int k = , i;
for (i = ; i <= shu.x; i++)
{
if (visit[i] == )
{
k = i;
break;
}
}
return k;
}//判断图中没有visit的项 int main()
{
cout << "请输入数组行数和列数:" << endl;
int x, y;
cin >> x >> y;
A shu;
set(shu, x, y);
output(shu); int v = , b[N] = { }, h = ; for (int i = ; i <= shu.x; i++)
{
if (shu.d[i]<)
{
b[i] = shu.d[i];
}
else
{
int visit[N] = { };
int max = ;
bianli(shu, i, visit, b[i], max, x);
}
} int max = b[];
for (int i = ; i <= shu.x; i++)
{
if (b[i]>max)
max = b[i];
}
cout << "最大联通子数组的和为:" << max << endl;
}

Task 4.5 求二维数组中的最大连通子数组之和的更多相关文章

  1. Problem N: 求二维数组中的鞍点【数组】

    Problem N: 求二维数组中的鞍点[数组] Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2764  Solved: 1728[Submit][S ...

  2. Python求二维数组中某列的最大值

    主要运用np.amax() import numpy as np help(np.amax) a = np.arange(9).reshape((3, 3)) max_all = np.amax(a) ...

  3. C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,

    //函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...

  4. 剑指offfer:二维数组中的查找

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成这样一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如: 1    2  ...

  5. 二维数组中的查找(python)

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  6. 求二维数组最大子数组的和。郭林林&胡潇丹

    求二维数组子数组的最大值,开始思路不太清晰.先从最简单的开始. 以2*2的简单数组为例找规律, 假设最大数为a[0][0],则summax=a[0][0],比较a[0][0]+a[0][1].a[0] ...

  7. 剑指offer:二维数组中的查找

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...

  8. C#版剑指Offer-001二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  9. 剑指Offer-【面试题03:二维数组中的查找】

    package com.cxz.question3; /* * 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. * 请完成一个函数,输入这样的一个二维数组和 ...

随机推荐

  1. Ural 1183 Brackets Sequence(区间DP+记忆化搜索)

    题目地址:Ural 1183 最终把这题给A了.. .拖拉了好长时间,.. 自己想还是想不出来,正好紫书上有这题. d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列.0< ...

  2. mybatis框架下使用generator插件自动生成domain/mapping/mapper

    手动去创建domain/mapping/mapper费时费力还容易出错,用插件自动生成非常的方便. 这里以MySQL数据库为例,也可以改成Oracle,改成相应的驱动和URL即可. 下载generat ...

  3. Mac 使用.bash_profile

    1.打开terminal(终端) 2.open .bash_profile (打开.bash_profile文件,如果文件不存在就  创建文件:touch .bash_profile  编辑文件:op ...

  4. day 87 Vue学习六之axios、vuex、脚手架中组件传值

      本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的使用 Axios 是一个基于 promise 的 HT ...

  5. Spark MemoryManager内存模型

  6. helpera64开发板下制作ubuntu rootfs镜像

    下一篇路径:https://www.cnblogs.com/jizizh/p/10499448.html 环境: HelperA64开发板 Linux3.10内核 时间:2019.02.14 目标:定 ...

  7. Oracle 安装过程中 File not found "WFMLRSVCApp.ear" 的原因

    主要有两种原因: 1 只解压缩了第一个zip文件. 2 两个zip 文件解压缩到了两个不同的目录里.

  8. 阿里云rds 磁盘空间满导致实例锁定

    1.RDS 数据日志已经快满了, 导致数据库不能写入,只读. 2. Binlog日志的保存及清理规则 MySQL实例的空间内默认清理binlog日志的规则如下: 实例空间内默认会保存最近18个小时内的 ...

  9. 自动分配ip的方法- 【Linux】

    1.  查看本机无线网络使用的网卡 2.  设置vbox的网络连接为桥接,并选择本机无线网络对应的网卡 3.  进入系统,输入ifconfig命令,记录下系统的HWaddr 4.  修改系统ip配置文 ...

  10. SICP读书笔记 3.5

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...