求最大子数组03

题目:

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

要求:

1. 输入一个二维整形数组,数组里有正数也有负数。 求所有子数组的和的最大值。要求时间复杂度为O(n)。

2.程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数。

代码:

#include<iostream>
#include<fstream>
using namespace std;
/*
//求一维数组子数组和的最大值
*/
int getMax(int j,int *array,int &first,int &last,int col)//first、last为起始元素和最终元素位置
{
    int sum = 0, max = 0;
    int a[100];
    for (j = 0; j < col; j++)
    {
        sum = sum + array[j];
        a[j] = sum;
        if (sum < 0)//和为正数时
        {
            sum = 0;
        }
        if (sum > max)
        {
            max = sum;
            if (max == 0)//和为负数时
            {
                sum = sum + array[j];
                if (sum > max)
                {
                    max = sum;
                }
            }
        }
        if (a[j - 1] < 0 )
        {
            first = j;
        }
        if (a[j] == max)
        {
            last = j;
        }
    }
    return max;
}

int main()
{
    int i, j,map[100][100];
    int array[100];
    int max_row[100];
    int M[100];
    int max = 0;
    int first_num=0;
    int last_num=0;
    int row,col;
    ifstream infile("input.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    infile >> row;
    infile >> col;
    for(i = 0; i < row; i++){
        for(j = 0; j < col;j++){
            infile >> map[i][j];
        }
    }
    cout << "array:"<<endl;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            cout << map[i][j]<<" ";
        }
        cout << endl;
    }
    cout << endl;

    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            array[j] = map[i][j];
        }
        max_row[i]=getMax(j, array,first_num,last_num,col);//求每一行的子数组和的最大值
        cout << max_row[i] << endl;//每行最大元素
        cout << "first element" << first_num + 1 << endl;
        cout << "last element" << last_num + 1 << endl;
    }
    for (i = 0; i < row; i++)
    {
        if (map[i][last_num] >= map[i + 1][first_num] || map[i][first_num] <= map[i+1][last_num])
        {
            M[i] = max_row[i] + max_row[i+1];
            if (M[i] > max)
            {
                max = M[i];
            }
        }
    }
    cout << "sum of max connected array:" << max;
    return 0;
}

我的结对开发队友 信1301-2班 肖兴堂

时间: 2024-12-23 05:49:23

求最大子数组03的相关文章

一维数组头尾相连求最大子数组

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1. 设计思想: 因为已经写过了一维数组的求最大子数组程序.所以只是在原程序上进行修改.首先产生随机数数组,然后进行计算,因为要求时间复杂度

二维数组求最大子数组

设计思路: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数: 最后进行结果的输出与验证. 代码: 法一: package zishuzu; import java.util.*; public class zuixiaozishuzu { public stat

一维数组求最大子数组(解决溢出问题)

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 程序在宏里面定义出了数组长度的大小,在长度超过100万的时候程序直接崩溃,其实这并不是因为结果太大导致的数值溢出,而是因为内存溢出,我们的数组是定义在程序内部的,属于局部变量,存放位置在栈上

结对开发--四实现循环二维数组求最大子数组的和

一.实现思路 再上一个实验基础上加上环,我们实现环的思想是每一列依次向此替换,直至替换出能出现的所有的二维数组,再用上一个求最大子数组的方法全部实现 二.实验代码 package com.minirisoft; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Scanner; public class HuanTwoArray { public stat

课堂作业:首尾相连求最大子数组

1.设计思想 先将数组环拆解补在原来数组后面,再依次找子数组并相加,更新最大值,并需要将开始的负数舍去从正数开始算起,单独讨论全负情况. 2.源程序 package zishuzu; import java.util.Scanner; public class zsz { public static void main(String[] args) { System.out.println("请输入数字个数:"); Scanner in=new Scanner(System.in);

数组问题之求最大子数组问题(一)

结束了 四则运算的所有内容 这次老师布置了 数组问题 求最大子数组的问题 课堂上 老师就已经提供了数种方案 并提出了时间复杂度的要求 于是和我的搭档找到了认为最为简便的算法 过程中和小于0,那么和最大的子数组不会包含前面子数组,之后将和归0,从下个元素重新开始计算 于之前的实验 理清思路 代码实现不算太难 代码如下 1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int i,num; 7 cout <<

结对——二维数组首尾相连求最大子数组和

一.题目与要求 题目.返回一个二维整数数组中最大子数组的和 要求.1.输入一个二维整形数组,数组里有正数也有负数. 2.二维数组首尾相接,象个一条首尾相接带子一样. 3.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和 二.设计思路 在上一次的以为循环数组的基础上,和二维数组求最大子数组相结合,将功能合并,完成题目要求. 第一步.将每一行的数组作为循环数组求最大子数组 第二步.通过枚举的方式,将每一种情况的和存入到新建二维数组中 第三部.通过逐列计算最大子数组的方法求所有子矩阵的最

循环一维数组求最大子数组

题目: 随机出一个一维数组,设该数组为循环数组,求其最大小子数组. 一.设计思路 求最大子数组,就求出最大的连续正子数组. 将数组分为全负和有非负值两种情况.全负求出最大值即可. 在有非负值的情况下,先判断该随机数组的首尾是否相连,即首尾是否都大于等于零.如果首尾相连,则将该一维数组分为首.中.尾三部分,先求出首尾和S1,再求中间最大连续正子数组和S,令S1和S与maxS相比较,求出最大子数组:如果首尾不相连,则直接借鉴前一种情况中部的算法,求最大正子数组S. 二.源代码 1 //刘双渤,刘洪阳

环形数组求最大子数组之和

环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一种为数组中存在正数情况,一种为全部为负数的情况: 在存在正数的情况中又可分为三种情况,一种为全部为正数的情况,一种为自设的头元素为正数,最后一种为自设的头元素为负数.根据这几种情况分类进行实现. 在实现过程中,对数组元素从头到尾进行遍历,如果遇到正数即用和相加,直到相邻的下一个为负数,即存放目前该最