返回一个最大联通子数组的和

#include<iostream>
#include<ctime>
using namespace std;
#define N 100

typedef struct
{
    int dian[N];
    int xian[N][N];
    int dianx, xianx;
}A;

void set(A &shu, int x, int y)
{
    shu.dianx = x*y;
    srand((unsigned)time(NULL));
    for (int i = 1; i <= shu.dianx; i++)
    {
        shu.dian[i] = rand() % 10;
        if (rand() % 2 == 1)
            shu.dian[i] = shu.dian[i] * (-1);
    }
    for (int i = 1; i <= shu.dianx; i += y)
    {
        for (int j = i; j <= i + y - 2; j++)
        {
            shu.xian[j][j + 1] = 1;
            shu.xian[j + 1][j] = 1;
        }
    }
    for (int i = 1 + y; i<shu.dianx; i += y)
    {
        for (int j = i; j <= i + x - 1; j++)
        {
            shu.xian[j][j - y] = 1;
            shu.xian[j - y][j] = 1;
        }
    }
}
void output(A shu)
{
    for (int i = 1; i <= shu.dianx; i++)
    {
        cout << shu.dian[i] ;
        if (shu.xian[i][i + 1] == 1)
            cout << "  ";
        else
            cout << endl;
    }
}
void bianli(A &shu, int v, int visit[], int &b, int &max, int x)
{
    visit[v] = 1;

    max += shu.dian[v];
    if (max >= b)
        b = max;

    int a = 0, bo = 0;
    for (int w = 1; w <= shu.dianx; w++)
    {
        for (int c = 1; c <= shu.dianx; c++)
        {
            if ((visit[w] == 0) && (shu.xian[c][w] == 1) && (visit[c] == 1))
            {
                a = w; bo = 1; break;
            }
        }
        if (bo == 1)
            break;
    }
    for (int w = 1; w <= shu.dianx; w++)
    {
        for (int c = 1; c <= shu.dianx; c++)
        {
            if ((visit[w] == 0) && (shu.xian[c][w] == 1) && (visit[c] == 1))
            {
                if (shu.dian[a]<shu.dian[w])
                    a = w;
            }
        }
    }
    if (b + shu.dian[a]<0)
    {
        shu.xian[v][a] = 0;
    }
    else
        bianli(shu, a, visit, b, max, x);
}

int NoVisit(int visit[], A shu)
{
    int k = 0, i;
    for (i = 1; i <= shu.dianx; i++)
    {
        if (visit[i] == 0)
        {
            k = i;
            break;
        }
    }
    return k;
}

int main()
{
    cout << "请输入数组行列数:" << endl;
    int x, y;
    cin >> x >> y;
    A shu;
    set(shu, x, y);
    output(shu);

    int v = 1, b[N] = { 0 }, h = 0;
    for (int i = 1; i <= shu.dianx; i++)
    {
        if (shu.dian[i]<0)
        {
            b[i] = shu.dian[i];
        }
        else
        {
            int visit[N] = { 0 };
            int max = 0;
            bianli(shu, i, visit, b[i], max, x);
        }
    }

    int max = b[1];
    for (int i = 2; i <= shu.dianx; i++)
    {
        if (b[i]>max)
            max = b[i];
    }
    cout << "最大联通子数组的和为:" << max << endl;
}

题目要求:

输入一个二维整形数组,数组里有正数也有负数。

求所有子数组的和的最大值。

设计思想:这道题目感觉很难,第一次设想是求出每一行最大子数组的和,同时求出他们的坐标,比较他们是否在同一行,后来发现很难实现

通过图的遍历可以查找

结果:并不是自己所做,题目还是偏难。

时间: 2024-10-06 03:35:26

返回一个最大联通子数组的和的相关文章

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

返回一个二维整数数组的最大联通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求:输入一个二维整形数组,数组里有正数也有负数.求所有子数组的和的最大值. 一.设计思想 先求出这个这个数组中的最大值,并定位,然后找出这个值周围的4个数,联通这4个数中的正数,若全为负数,则查找次大值,并与最大值联通,判断联通前与联通后值得大小,若变小则不联通最大值,若变大则联通最大值,以此类推,直到最大联通子数组怎么联通都比原来的值小.

返回一个二维整数数组中最大联通子数组的和(思路)

返回一个二维整数数组中最大联通子数组的和 题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 思路: (方法一)首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. (方

返回一个二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 方法一:首先若要对二维数组进行分析,之前我们已经做过关于一位数组的练习,所以我们可以把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的结果就是最大联通子数组的和

返回一个二维数组中最大联通子数组的和

1 #include <iostream> 2 #include <time.h> 3 #include<string> 4 #include<fstream> 5 #define M 3 6 #define N 4 7 using namespace std; 8 9 int main() 10 { 11 int length[100],num[M][N] = {0},visit[M][N]={0},i=0;//length[100],是把文件中的数组转化

返回二维数组子数组联通和最大

分析 1,开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0: 2,将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值: 3,取以每个点为起点遍历的和的最大值即时最大联通子数组的和.遍历时,选取已遍历的联通子数组周围最大值遍历.经过重复的几次遍历就可以确定此数组中最大连通数组和了. 题目要求: 放在一个input.txt的文件中 数组里面有正数有负数 返回联通子数组和最大的值 #include<fstr

返回二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 第一种方法:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. 第二种方法:在二维整形数组中,数据可

联通子数组最大值设计03

So郁闷,我先把老师提出的问题写出来; 返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.下面是给的示例图: 最近已经完全的陷入了编程的怪圈,自己完全没找到自己的方向吧,废话不多说,直接上问题:在子数组问题上我觉得基本都是一位子数组的变形,应该不会有特别的变化,最多是难度上去,但是基本的思想不会变,今天我发现错了,可能是我错了. 我的想法:在网上看代码找到的灵感:因为觉得老师上课讲的图的方法有些麻烦所以就想还是用一维数组的

最大联通子数组的和(二)

设计思路同最大联通子数组的和(一)http://www.cnblogs.com/brucekun/p/5356994.html 将(一)未完成的部分做了基本补充,但是还存在bug: ⑴每行最大子数组的和为负数时显示为0(具体算法见http://www.cnblogs.com/brucekun/p/5316601.html) ⑵返回每行最大子数组的起始和最后元素时有时会出错 源代码: 1 #include<iostream> 2 #include<ctime> 3 int max_(