zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和2

    输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

    #include <iostream>

    #include <time.h>

    using namespace std;

    #define M 3

    #define N 6

    void main()

    {

        int a[M][2*N]={0},b[2*N],d = 0,d1 = 0;

        int maxd[2*N]={0} ,end1[2*N] = {0},end2 = 0;

        int i_max = 0,j_max = 0 ,jj = -1,j1 = 0,j2 = -1;

        srand((unsigned int)time(0));   

        for (int i = 0;i < M;i++)

        {

            for (int j = 0;j < N;j++)

            {

                a[i][j] = rand()%50 - 25;

                a[i][j+N] = a[i][j];

                cout << a[i][j] << " ";

            }   

            cout << endl;

        }

        maxd[0] = a[0][0];

        for (int i = 0;i < M;i++)//i为0,表示1行,i为1表示两行数···

        {

            for (int i_hang = 0;i_hang < M-i;i_hang++)//当1行是循环3次

            {

                for (int j = 0;j < 2*N;j++)//赋初值

                {

                    b[j] = 0;

                }

                for (int i_hang1 = i_hang;i_hang1 <= i_hang+i;i_hang1++)//每次循环i次赋值

                {

                    for (int j = 0;j < 2*N;j++)

                    {

                        b[j] += a[i_hang1][j];

                    }

                }

                d = 0;j2 = -1;j1=0;jj=-1;

                for (int ii = 0;ii < 2*N;ii++)

                {   

                    d += b[ii];

                    if (d > maxd[j1-1])

                    {

                        maxd[j1] = d;

                        end1[j1] = ii;

                        i_max = i;       //最大的时候是i行;

                        j_max = i_hang;   //

                        j1++;

                        j2 = jj;

                    }

                    if(d < 0)

                    {

                        d = 0;

                        jj = ii;

                    }

                    if (end1[j1-1] - j2 > N)   //如果end1[j1-1] - j2大于N个数,那么就获取end1[j1-2]

                    {   

                        j1--;

                        break;

                    }

                }

                end2 = j2+1;           

            }

        }   

        cout << "子数组为:" << endl;

       

        for (int k = 0;k <= i_max;k++)

        {

            for (int i = end2;i <= end1[j1-1];i++)

            {

                cout << a[j_max+k][i] << " ";

            }

            cout << endl;

        }

        cout << endl;

        cout << "和为: " << maxd[j1-1] << endl;   

    }


  • 相关阅读:
    【设计模式】—— 单例模式Singleton
    【java开发系列】—— 深克隆和浅克隆
    【设计模式】—— 原型模式Prototype
    ArcMap 导入Excel坐标数据
    如何将XML文件导入Excel中
    ArcGIS API for Javascript之专题图的制作(四)热力图渲染(上)
    ArcGIS js api 手动构建FeatureLayer
    word怎样从第三页开始设置页码
    ArcGIS API for JS4.7加载FeatureLayer,点击弹出信息并高亮显示
    [转载]ArcGIS SERVER 9.3如何清除REST缓存
  • 原文地址:https://www.cnblogs.com/chengchengshuaio/p/4594919.html
Copyright © 2011-2022 走看看