最大子数组之联通版

本程序的基本功能是:输入数组的行数和列数,程序自动生成对应规格的数组,在满足连通性的情况下,求最大的子数组的和。

主要的功能的实现是依靠图的遍历。

团队成员:王硕  http://home.cnblogs.com/u/WS1004/
#include<fstream>
#include<iostream>
#include<ctime>
using namespace std;
#define RAND16 ((rand()<<1) + (rand()&1))
#define N 100
# define WIDE 4294967296
typedef struct
{
    long long int dian[N];
    long long int xian[N][N];
    long long int dianx, xianx;
}A;

void set(A &shu, int x, int y)
{
    shu.dianx = x*y;
    srand((_int32)time(NULL));
    for (int i = 1; i <= shu.dianx; i++)
    {
        shu.dian[i] = (RAND16 << 16) + RAND16;
        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 bianli(A &shu, long long int v, long long int visit[], long long int &b, long long int &max, long long 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(long long 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);
    ofstream fout("D:\\input.txt",ios::binary);
    for (int i = 1; i <= shu.dianx; i++)
    {
        fout << shu.dian[i] ;
        if (shu.xian[i][i + 1] == 1)
            fout << "   ";
        else
            fout << "\r\n";
    }
    long long 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
        {
            long long int visit[N] = { 0 };
            long long int max = 0;
            bianli(shu, i, visit, b[i], max, x);
        }
    }

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

总结:

本次编程中出现了一些问题,在文件中输出不能换行,后上网得知把endl改为\r\n即可。

此次编程有上两次编程的基础,化难为易的思想发挥了非常大的作用。

时间: 2024-10-16 21:18:29

最大子数组之联通版的相关文章

求最大子数组值(有环版)

设计思路:将环从合适的地方断开,再进行链式的寻找最大子数组值. 具体实现:将环分开:从下标为0的数开始查询,找出值为负值的第一个数,从这个数(不含此数)开始进行无环式求最大值的运算来找到第一个被“丢弃的”sum值(sum值为存储),从这个负值处将此环分开. 代码: 总结:总是忘记命名规范.

最大子数组之和首位相邻32位版

返回一个整数数组中最大子数组的和,细化分析: 1,在所有以元素tail结尾的子数组中,选出元素和最大的子数组,tail=1,2...n. 2,以元素k结尾的和最大的子数组是包含以元素tail-1结尾的和最大的子数组还是就只有元素tail这一个元素,一共有这两个可选状态. 3,在得到以每个元素结尾的和最大的子数组之后,只要取其中最大值就是所有子数组中最大的子数组. 4,将数组元素的类型定义为_int32,数组元素随机产生. 团队成员:王硕  http://home.cnblogs.com/u/WS

软件工程个人作业04 - 整数数组中最大子数组和(第二版)

要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 设计思想: 1 设传参的数组长为n,创建长度为2n的辅助数组,按顺序赋两遍值 2 每一个以 i 开头的子数组有 n 个,也就是从 第 i 个到 n+i (i<=n) 3 将得到的子数组求和并存起来,判断和数组中的最大值即可. 源代码: import java.util.Vector; public clas

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

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

二维数组最大子数组(结对开发)

1.题目要求 题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 2.设计思想: 对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块

一个关于求数组内最大子数组的和的小程序以及一周总结

一个数组内有正数和负数,而且数组是循环的.求数组内最大子数组的和.要求数组是算法空间复杂度为O(1). 思路: 1.求出每个子数组的值,比较大小. 2.定义一个参数,为数组的长度. 3.构造另外的数组,使得是原数组的得到两个集合.比如a={1,2,3,4}.b={1,2,3,4,1,2,3,4}; 4.这样可以满足数组的循环,参数为原数组的长度. 代码如下: package zuida; import java.io.*; import java.util.Scanner; class qiu

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

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

最大子数组的线性解法

题目出自算法导论第三版,4.1-5. 该题中提出“在已知A[1...j]中最大子数组的情况下,可以在线性时间内找出形如A[i...j+1](1<=i<=j+1)的最大子数组”,这一点让我大惑不解.如果这样是线性的话,那遍历数组,总的解法不又是O(N²)了么?又何谈O(N)? 必然得在常量时间内找出A[i...j+1]才行.那么如何在常量时间内找出它呢?

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

1.设计思想:先用户键盘输入一个自定义的几行几列的矩阵,然后输入相关的值,再调用求二维数组最大联通子数组和的方法,最终输出最大值. 2.出现问题:对于求联通子数组的这个思路不是很懂,不清楚. 3.解决方案:先求每行的最大和最小块,再求总的最大值,再将其输出:当列数为1时,当成一维计算: 4.源代码: /*返回一个整数数组中最大子数组的和. 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.