求最大子数组03

Posted 伟哥8882

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最大子数组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班 肖兴堂

 

以上是关于求最大子数组03的主要内容,如果未能解决你的问题,请参考以下文章

求最大子数组的思想和代码

数组03

求二维数组最大子数组

环状数组求最大子数组

求一维数组最大最大子数组和

求一个二维整数数组中最大子数组的和