首尾相接二维数组(圆柱)--求最大子矩阵

一 题目:一个首尾相接的二维数组,其中有有正数,有负数,求它的最大子矩阵。

二 设计思路:

这道题基本无难度,因为这道题可以参考以前做过的求解二维数组的子矩阵(不是首尾相接),所以可以简单划分为两部分。第一步先将它化为一维首尾相接的数组(环),然后再利用求解环中最大子数组的思想求解。具体将二维数组化为一维数组请参考(http://www.cnblogs.com/houtaoliang/p/4401630.html),在此只简单分析求解环的最大子数组。

求解环的最大子数组可分为两种情况。第一种:当数组下标没有越界,举例说明,如 -2 1 5 9 -6 4,最大子数组为1 5 9。这时可以利用动态规划的思想求解。假设最大子数组为a[i]--a[j-1],令sum=a[i]+..+a[j-1],若它为最大子数组则必有sun+a[j]>a[j]即sum>0,否则令a[j]赋值给sum。第二种情况是数组越界时,如 1 3 2 -9 -4 6

此时就相当于求解数组中的最小子数组(和求最大子数组原理一样),再用全部数组和减去这个最小子数组,就得到了最大子数组。

三 代码

#include<iostream>
using namespace std;

int MAX(int s[],int n)
{
    int i,sum=0,max=s[0];
    for(i=0;i<n;i++)
    {
        if(sum>0)
        {
            sum=sum+s[i];
        }
        else
        {
            sum=s[i];
        }
        if(sum>max)
        {
            max=sum;
        }
    }
    return max;
}

int MIN(int s[],int n)
{
    int i,sum=0,min=s[0];
    for(i=1;i<n;i++)
    {
        if(sum<0)
        {
            sum=sum+s[i];
        }
        else
        {
            sum=s[i];
        }
        if(sum<min)
        {
            min=sum;
        }
    }
    return min;
}

int SUM(int s[],int n)
{
    int i,sum=0;
    for(i=0;i<n;i++)
    {
        sum=sum+s[i];
    }
    return sum;
}

void main()
{
    int m,n,i,j,a[100][100];
    cout<<"请输入矩阵的大小(m*n):";
    cin>>m>>n;
    cout<<"请输入矩阵:"<<endl;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>a[i][j];
        }
    }
    int sum,max,s[100],k=0,min,p=a[0][0];
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            s[j]=0;
        }
        while(k+i<m)
        {
            for(j=0;j<n;j++)
            {
                s[j]=s[j]+a[k+i][j];
            }
            sum=SUM(s,n);
            min=MIN(s,n);
            max=MAX(s,n);
            if(sum-min>max)
            {
                max=sum-min;
            }
            if(max>p)
            {
                p=max;
            }
            k++;
        }
        k=0;
    }
    cout<<"子矩阵最大值为"<<p<<endl;
}

四 截图

时间: 2024-10-13 15:51:57

首尾相接二维数组(圆柱)--求最大子矩阵的相关文章

二维数组首尾相连求最大子矩阵

源代码: #include<iostream>using namespace std;#include"math.h" void main(){    int N=5;    int M=5;    int n=-10;    int m=10;    int a[5][10];    int b[10];    int A=0;    int Max=0;    int MAX=0;    cout<<"请输入数组元素:";    for(

二维数组循环求出最大子数组

package shengcheng; import java.util.Scanner; import org.junit.Test; public class ErweiXunhuan { @Test public void fun() { int [][]a=new int[4][8]; Scanner write=new Scanner(System.in); for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { a[i][j]=write.nex

二维数组环求最大子数组

返回一个二维整数数组中最大联通子数组的和 2015年6月22日 1.题目 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 2.设计思路 参照环状一维数组,将二维数组进行扩展.只将数组的列数扩大为原来的2*n-1,行数不变. 3.源代码 #include <iostream> #include<time.h> using namespace std

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

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.源代码 #include<iostream.h> int main() {  int x,y,n,m;  int s[10][20];  int sum[10][20]; cout<<"请输入3行4列的矩

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

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

3月31号周二课堂练习:结对开发----求二维数组组成的矩阵中子矩阵的最大值二

一.题目要求 1.1输入一个二维整形数组,数组里有正数也有负数. 1.2二维数组首尾相接,象个一条首尾相接带子一样. 1.3数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.4求所有子数组的和的最大值.要求时间复杂度为O(n). 二.结对要求 2.1两人结对完成编程任务. 2.2一人主要负责程序分析,代码编程. 2.3一人负责代码复审和代码测试计划. 2.4发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三.设计过程 上次已经算过二维数组中

结对开发---二维数组

结对: 严雅芳 20132988 王欣欣 20132990 (1)设计思路: 二维数组的求子数组的最大和,在本次设计中利用了一维数组的思路:从第一个数开始把数组相加,每加一个数对和进行判断,如果小于零,抛弃当前值,如果大于零,下一个数与零比较,小于零时,先将最大值与之前的和比较,在让和加上这个数,如果大于零,直接让和加上这个数,再取最大值和和之间的最大值.因为是二维数组:当到第n行时,对第n行和其前面的n-1.n-2.....0行进行设计,让第n行和其前面列数相同的每1.2.3....n行的数相

二维数组求子数组之和最大值(首尾相接, 圆柱)

问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱) 成员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组.之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值. 代码: #include<iostream> using namespace s

二维数组首尾相接,象个一条首尾相接带子一样,求所有子数组和的最大值

题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二维数组首尾相接,象个一条首尾相接带子一样. 3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 4 求所有子数组的和的最大值.要求时间复杂度为O(n). 设计思想 目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案 源代码 #include<iostream> #include<time.h> #include<