Task 4.5 求二维数组中的最大连通子数组之和
任务:输入一个二维整形数组,数组里有正数也有负数。 求所有子数组的和的最大值。要求时间复杂度为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 求二维数组中的最大连通子数组之和的更多相关文章
- Problem N: 求二维数组中的鞍点【数组】
Problem N: 求二维数组中的鞍点[数组] Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 2764 Solved: 1728[Submit][S ...
- Python求二维数组中某列的最大值
主要运用np.amax() import numpy as np help(np.amax) a = np.arange(9).reshape((3, 3)) max_all = np.amax(a) ...
- C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,
//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...
- 剑指offfer:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成这样一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如: 1 2 ...
- 二维数组中的查找(python)
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 求二维数组最大子数组的和。郭林林&胡潇丹
求二维数组子数组的最大值,开始思路不太清晰.先从最简单的开始. 以2*2的简单数组为例找规律, 假设最大数为a[0][0],则summax=a[0][0],比较a[0][0]+a[0][1].a[0] ...
- 剑指offer:二维数组中的查找
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...
- C#版剑指Offer-001二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 剑指Offer-【面试题03:二维数组中的查找】
package com.cxz.question3; /* * 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. * 请完成一个函数,输入这样的一个二维数组和 ...
随机推荐
- 基于vue-cli的快速开发框架
基于vue-cli的快速规范开发框架,已封装常用组件,可直接进行基本项目开发 1,遵循eslint规则,提升代码质量 2,集成mock模拟服务端数据,提升开发效率 3,集成vuex,可直接使用开发 4 ...
- 使用canvas通过js制作一个小型英雄抓怪兽的2D小游戏
首先,这是一个HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 关于:url、视图函数、模板3者之间参数传递的理解
url获取参数的途径有2个: 1.url中的变量,设置在URL地址中. 2.url中添加字典,设置在URL地址外. urlpatterns = [ path('<year>/<int ...
- Kafka系列文章
Kafka系列文章 Kafka设计解析(一)- Kafka背景及架构介绍 Kafka设计解析(二)- Kafka High Availability (上) Kafka设计解析(三)- Kafka H ...
- 7-[多线程]-Event、定时器、队列、堆栈
1.Event对象 线程的一个关键特性是每个线程都是独立运行且状态不可预测. 如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手. 为了解决这些问题 ...
- 1、算法介绍,lowB三人组,快速排序
1.什么是算法 2.递归 # 一直递归,递归完成再打印 def func4(x): if x > 0: func4(x - 1) print(x) func4(5) 3.时间 复杂度 (1)引入 ...
- MAC中VMware Fusion 的VMTools安装
题记:这几天在做SDN方面研究,需要装mininet,https://github.com/mininet/mininet/wiki/Introduction-to-Mininet,按照这个教程装好, ...
- Tomcat学习(一)------部署Web应用方法总结
Tomcat部署Web应用方法总结 在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署. 在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署 静态部署 ...
- VS2017 C++操作mysql数据库
1.首先安装mysql 具体教程可以参考https://blog.csdn.net/zhouzezhou/article/details/52446608 注意安装产品的时候记得选择MySQL Con ...
- 【Unity Shader】(十) ------ UV动画原理及简易实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...