二维数组首尾相连最大子数组

电脑坏了,忘了发了。。。。

题目:返回一个二维整数数组中最大子数组的和。

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

二维数组首尾相接,象个一条首尾相接带子一样。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

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

思路:

将求二维数组最大子数组与一维数组首尾相连求最大子数组结合起来

代码:

#include <iostream>
#include <cstring>
#include <assert.h>
const int N = 500;
const int INF = -9999;
using namespace std;

void output(int a[][N], int n, int head, int foot, int begin, int last)    //head、foot表示上下界限,begin、last表示左右界限
{
    int i,j;

    cout<<"子数组为:"<<endl;
    for(i=head; i<=foot; i++)
    {
        if ( last < begin)
        {
            for (j=begin; j<n; j++)
            {
                cout<<a[i][j]<<" ";
            }
            for (j=0; j<=last; j++)
            {
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        else
        {
            for (j=begin; j<=last; j++)
            {
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
    }

    cout<<endl;
}

int maxSubArray(int a[], int n, int &begin, int &last)
{
    assert(a!=NULL && n>0);

    int max = INF;
    int sum;

    int i,j,k;

     for (i=0; i<n; i++)
     {
        sum = 0;

        for (j=i; j<n; j++)
        {
            sum += a[j];

            if ( sum > max )
            {
                max = sum;
                begin = i;
                last = j;
            }
        }
        for(k=0; k<i; k++)     //从首开始
        {
            sum += a[k];

            if ( sum > max )
            {
               max = sum;
               begin = i;
               last = k;
            }
        }
     }

    return max;
}

int findMaxSubMatrix(int a[][N], int n)
{
    int tmpSum[N];
    int max = INF;
    int begin, last, begin1, last1, head, foot;

    //枚举所有行的可能组合
    for (int i=0; i<n; i++)
    {
        //将tmpSum清零
        memset(tmpSum, 0, sizeof(tmpSum));

        for (int j=i; j<n; j++)
        {
            //加上当前行的元素
            for(int k=0; k<n; k++)    //每一列
            {
                tmpSum[k] += a[j][k];
            }
            int tmpMax = maxSubArray(tmpSum, n, begin1, last1);
            if(tmpMax >max)
            {
                begin = begin1;
                last = last1;
                head = i;
                foot = j;
                max=tmpMax;
            }
        }

    }

    output(a, n, head, foot, begin, last);

    return max;
}

int main()
{
    int a[N][N];
    int n;    //数组的大小
    cout<<"请输入数组n*n中n的大小: "<<endl;
    while (cin>>n && n)
    {
        for (int i=0; i<n; i++)
        {
            for (int j=0; j<n; j++)
            {
                int k=rand();
                a[i][j]= k%2==0 ?rand()%100+1:(-rand()%100+1);
            }
        }
        for (int i=0; i<n; i++)
        {
            for (int j=0; j<n; j++)
            {
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }

        cout<<endl;

        cout<<"最大子数组的和为: "<<findMaxSubMatrix(a, n)<<endl;
    }

    return 0;
}

测试截图:

1.n=4

2.n=5

感悟:

程序还是有点麻烦,必须得定义一个k从头再开始计算

时间: 2024-10-01 02:13:42

二维数组首尾相连最大子数组的相关文章

求一个已知二维数组的最大子数组和(司宇,廖强)

小组成员:司宇,廖强 设计流程:          设计界面:               程序设计:1.封装一个求二维整数组最大子数组和的子程序: 2.设计一个主函数,主函数可以调用子函数: 3.在主函数中添加代码,使主函数可以调用一个TXT文件并且得到要求的结果. 遇到的问题:1.在调用txt文件时,没办法使调用文件前两行分别显示行数和列数: 2.在调用子函数的时候,不知道应该赋值给子函数一个什么类型的参数: 3.如何将String类型的二维数组转化为int类型. 解决方案:(当我们遇到问题

首尾相连的二维数组的最大子数组

一.设计思路:通过综合求二维数组的最大子数组.求首尾相连的一维数组的最大子数组的算法,得出如下思路:首先将二维数组的子数组上下相加转化成许多一维数组,然后按照求首尾相连的一维数组的算法,遍历一维数组的所有子数组,求出子数组的最大值,即为首尾相连二维数组的子数组的最大值,并且在遍历过程中保留取得最大值的位置,输出二维数组的最大子矩阵. 二.代码: import java.awt.Point; import java.util.Scanner; public class main { public

结对开发(求二维首尾相接数组的最大子数组和)

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 一.设计思想 求环形二维数组最大子数组的和,可以转化为求一维数组最大子数组的和 我们有一个最初的二维数组a[n][n]找它的 最大子数组之和 1.我们先建立一个新的二维数组b[n][2*n-1], 2,这个新的二维数组就是将初始的二

求数组中最大子数组的和(二维环)

成员:林彦汝.张金 (这次角色调换,我主要负责代码复审,代码测试计划:张金负责程序分析,代码编程.) 题目: 返回一个二维整数数组中最大子数组的和 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路: 在求一维环形数组和二维数组最大子数组的和的基础上,我们将两个的方法综合起来求解关于二维环形数组.假设原二维数组a[3][3]为 1 -2 3 1 -3

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

二维数组中最大子数组的和

题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 借鉴网上代码整理得思路: 根据一位数组最大子数组求和的编程思路,讲二维数组转化成一维数组求解: 即求出每一行的最大子数组之和,通过比较各行最大子数组之和的大小,求出只有二维数组只有一行的情况下的最大子数组之和: 然后求每两行最大子数组之和,即将每两行的相同列相加,将二维数

《团队开发项目之三二维数组的最大子数组之和》

设计思想:按列或按行的次序依次进行计算每个以列或行的次序为基准的每种情况下的每个子矩阵的和,然后再依次进行比较每个子矩阵的和,取出最大的一个即是最大字数组之和: 源代码: //二维数组的最大子数组之和 //李敏,Apr 8th #include<iostream> #include<time.h> using namespace std; void main() { int m,n,a[100][100],k,t,c,i,j,z; int maxsum,sum[100],max=0

求二维数组中最大子数组的和

一.题目: 返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二:结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三:设计思路: 将二维数组的每行轮番逐次相加(包括单行)后看成一维数组,利用求

二维数组的最大子数组之和

一.设计思路:与求一维数组的最大子数组类似,将二维数组转化为一维数组来计算,也是通过遍历的方式将一个子矩阵与上几个子矩阵相加如果小于0则舍去这个子矩阵,按此方法计算从这个子矩阵以后的矩阵,求得遍历中最大值,即为最大子数组之和. 二.代码: package soft_third_test; public class test { static int maxSum(int p[][],int startLine,int endLine,int n){ int ans=p[endLine][1]-p