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; /* * 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. * 请完成一个函数,输入这样的一个二维数组和 ...
随机推荐
- 学习Java 采取令牌的方式避免重复提交
重复提交原因 从提交页面到成功页面的跳转一般采用视图定位,由于视图定位是在服务端跳转的,如果用户在点击提交之后再次刷新页面,会导致重复提交,数据库的数据会有重复. 采用令牌措施 1.在转账展示页面生成 ...
- 成为linux的合格公民
前言: 该片文章献给申请linux国籍的所有瘾君子们: 还记得17年的勒索病毒感染了无数的window操作系统. 在windows上待久的公民会渴望有无另一个世界,简单的图形化操作使得一切都变的 ...
- linux下使用shell脚本获取终端宽度
获取终端大小时候的学习 学习日期:2018/11/3 问题来源: 在写shell脚本时想输出一行占满整个终端屏幕宽度的 横杠 发现for循环会导致执行缓慢 解决方法: 使用yes 命令 sed '50 ...
- WPF实现MDI窗体的方法
原文:WPF实现MDI窗体的方法 第一:新建一个类(Class) Win32Native.cs 代码如下: using System; using System.Collections.Generi ...
- 11 [异常]-try...except
1.什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 2.错误 错误分成 ...
- 2-4 list练习题
参考答案 >>> names = [] >>> names.append('old_driver') >>> names.append('rain ...
- js中两种定时器的设置及清除
1.循环执行: var timeid = window.setInterval(“方法名或方法”,“延时”); window.clearInterval(timeid); <script typ ...
- IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度
缺点: 这样的话,前端的接口(也就是字符串)就搜索不到了. C:\Users\Administrator\.IntelliJIdea2017.3\system 删除里面的caches文件夹(这里的 ...
- [Luogu4921]情侣?给我烧了![错位排列]
题意 题意很清楚 \滑稽 分析 对于每一个询问 \(k\) ,记 \(g(x)\) 表示 \(x\) 对情侣都错开的方案总数,那么答案可以写成如下形式: \[ {ans}_k= \binom{n}{k ...
- Security2:角色和权限
权限的授予分为三部分:权限(Permission),安全对象(Securable)和安全主体(Principal),这三个术语之间的关系是:Grant Permission on Securable ...