任务:输入一个二维整形数组,数组里有正数也有负数。 求所有子数组的和的最大值。要求时间复杂度为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. Ubuntu 18.04安装MongoDB 4.0

    首先,导入包管理的公钥. Ubuntu包管理工具(即dpkg和apt)要求发行商使用GPG密钥签署包,从而确保包的一致性和真实性. sudo apt-key adv --keyserver hkp:/ ...

  2. centos配置静态ip地址

    1.输入以下命令: vim /etc/sysconfig/network-scripts/ifcfg-eth0 2.注释掉BOOTPROTO=dhcp 3.添加如下内容: ONBOOT=yes 表示开 ...

  3. Redis高级应用——2

    Redis-事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作,事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的 ...

  4. php数组 组合排列 笛卡尔积

    function Descartes() { $t = func_get_args(); if (func_num_args() == 1) { return call_user_func_array ...

  5. springboot整合Mybatis(一)——入门

    一.概述 1.先导 mybatis入门随笔:http://www.cnblogs.com/jiangbei/p/6884641.html 2.引入依赖 <dependency> <g ...

  6. 大数据入门第二天——基础部分之zookeeper(上)

    一.概述 1.是什么? 根据凡技术必登其官网的原则,我们先去官网瞅一瞅:http://zookeeper.apache.org/ Apache ZooKeeper is an effort to de ...

  7. 【转载】COM 组件设计与应用(七)——编译、注册、调用

    原文:http://vckbase.com/index.php/wv/1218.html 一.前言 上两回中,咱们用 ATL 写了第一个 COM 组件程序,这回中,主要介绍编译.册和调用方法.示例程序 ...

  8. js.ajax优缺点,工作流程

    1.ajax的优点 Ajax的给我们带来的好处大家基本上都深有体会,在这里我只简单的讲几点: 1.最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好.  2.使用异步方式与服务器通信,不 ...

  9. grads,fortran,ncl二进制文件

    #转自论坛日志# grad用fwrite生成的二进制文件大小和ncl用fbinwrite生成的不一样,相差有8个字节,参考了以下网页,问题出在顺序存取和直接存取的差异. 以下是我的理解,欢迎指正:   ...

  10. Python 循环的技巧

    当在字典中循环时,用 items() 方法可将关键字和对应的值同时取出 >>> knights = {'gallahad': 'the pure', 'robin': 'the br ...