zoukankan      html  css  js  c++  java
  • 二维数组求最大子数组

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

    一、实验题目

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

          实验要求:

          输入一个二维整形数组,数组里有正数也有负数。       二维数组首尾相接,象个一条首尾相接带子一样。       数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。       求所有子数组的和的最大值。要求时间复杂度为O(n)。 二、实验思路      这次我们设计的实验是手动输入二维数组的行数和列数,二维数组的环形求和我们设计的思路和一位数组的类似,就是把求完的数组的第一列放到最后,依次类推。求最大的子数组和时和二维数组的求和类似,即:输入的二维数组是 -1  2                                                                            3  4      

                                                                              -5  9

        (1)首先计算出第一行中有关-1的所有的子数组,然后计算出有关2的子数组,同样的道理可以计算第二行和第三行中的字数组。  

        (2)把上面计算出来的有关行中的子数组放在一个  b[3][3]即为 -1  1  2        的数组中。 

                                                                                             3  7  4                      

                                                                                           -5  4  9   

         (3)再求b[3][3]中的子数组的最大值,这次应该是按列来求。首先计算第一列中的子数组中的最大的数,先计算-1,然后计算-1+3,然后计算 -1+3+5,求出最大的来,再3+(-5)和max比较大小,求出最大的,再(-5)和max比较大小。同理求第二、三列。即可得出最大的来。

    三、源程序

    //信1201-2班 司新红 万彤
    #include "stdafx.h"
    #include "iostream"
    using namespace std;
    int main()
    {
        int hang,lie;
        int a;
        int i,j;
        int s;//    求和
        int count;
        int max;
        cout<<"请输入二维数组的行数:";
        cin>>hang;
        cout<<"请输入二维数组的列数:";
        cin>>lie;    
        int **A;//定义动态二维数组
        int **B;
        a=lie*lie;
        A=new int*[hang];
        for(int k=0;k<hang;k++)
        {
            A[k]=new int[lie];
        }
        B=new int*[hang];
        for(int l=0;l<hang;l++)
        {
            B[l]=new int[a];
        }
    
        /*数组初始化*/
    
        cout<<"请输入二维数组中的元素"<<endl;
        for(int i=0;i<hang;i++)
        {
            for(int j=0;j<lie;j++)
            {
                cin>>A[i][j];
            }
        }
    
    
        /*二维数组压缩函数*/
    
    
        for(i=0;i<hang;i++)
        {
            count=0;
            for(j=0;j<lie;j++)
            {
                s=0;
                for(int l=0;l<lie;l++)                            //每一行按顺序进行枚举存入数组中
                {
                    s=s+A[i][l+j];
                    B[i][count+l]=s;
                }
                count=count+lie;
                A[i][lie+j]=A[i][j];
            }
        }
    
    
        max=B[0][0];                                                //将数组的第一个数赋值给max
        for(j=0;j<a;j++)
        {
            for(i=0;i<hang;i++)
            {
                s=0;
                for(int r=0;r<hang-i;r++)
                {
                    s=s+B[r+i][j];                            //逐列对数组进行枚举,求最大值
                    if(max<s)
                    {
                        max=s;
                    }
                }
            }
        }
        cout<<"最大子数组之和为:"<<max<<endl;
        return 0;
    }

    四.实验截图

    五.实验心得

    我只能说老师真的是越来越为难我们了 ,我和小伙伴做了很多次的尝试才成功,其实如果上次做实验没有偷懒的话,这次的实验就不需要做这么大的手脚,其实每次的实验都是改动很小,但是由于上次的实验不是万精油,所有这次又得推翻重做。这是个教训,需要记住

  • 相关阅读:
    一些java的基础知识
    android基础AlertDialog使用
    Js+XML 操作 [ZT]
    [ASP.NET2.0] asp.net在ie7中使用FileUpload上传前预览图片 [ZT]
    C#对图片的几种简单处理 [ZT]
    使用 Bulk Copy 将大量数据复制到数据库 [ZT]
    html中name和id的区别 [ZT]
    两个分页存储过程
    C#常用的文件操作 (转)
    JSON
  • 原文地址:https://www.cnblogs.com/wantong/p/4392679.html
Copyright © 2011-2022 走看看