zoukankan      html  css  js  c++  java
  • 返回一个二维整数数组中最大子数组的和(头尾相接)

    1.题目。

    题目:返回一个二维整数数组中最大子数组的和。
    要求:
    输入一个二维整形数组,数组里有正数也有负数。
    二维数组首尾相接,象个一条首尾相接带子一样。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    2.设计思想。

      分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵。比较其中最大的子矩阵值,找出最大的。

    3.代码。

    #include<iostream>
    using namespace std;
    #include <ctime>
    #include <cstdlib>
    #define MAX 10000 
    int Max(int b[])
    {
        int m[MAX],n=0,p=0;
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                n=n+b[i+j];
                m[p]=n;
                p++;
            }
            n=0;
        }
        int max=m[0];
        for(i=0;i<p;i++)
        {
            if(m[i]>max)
                max=m[i];
        }
        return max;
    }
    
    int main()
    {
        int k[MAX],a[4][8],h[8];
        srand(time(0));
        cout<<"该矩阵为:"<<endl;
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                a[i][j]=rand()%100-50;
                a[i][j+4]=a[i][j];
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        for(i=0;i<4;i++)
        {
            k[i]=Max(a[i]);
        }
        int  q=4;
        for(i=0;i<3;i++)
        {
            int    t=0;
            for(int j=0;j<8;j++)
            {
                
                h[t]=a[i][j]+a[i+1][j];
                t++;
            }
            k[q]=Max(h);
            q++;
        }
        for(i=0;i<2;i++)
        {
            int    t=0;
            for(int j=0;j<8;j++)
            {
                
                h[t]=a[i][j]+a[i+1][j]+a[i+2][j];
                t++;
            }
            k[q]=Max(h);
            q++;
        }
        int t=0;
        i=0;
        for(int j=0;j<8;j++)
        {
            
            h[t]=a[i][j]+a[i+1][j]+a[i+2][j]+a[i+3][j];
            t++;
        }
        k[q]=Max(h);
        q++;
        cout<<endl;
        int max=k[0];
        for(i=0;i<q;i++)
        {
            if(k[i]>max)
                max=k[i];
        }
        cout<<"最大子矩阵的值为:"<<endl;
        cout<<max;
        return 0;
    }

    4.运行结果。

    5.体会。

      有了思路,进行编程时就方便多了,即使有些方面不好实现,但是大家一起思考,还是能解决的。

    6.照片。

  • 相关阅读:
    mfc cef<转>
    js人形时钟
    opencv给图片添加文字水印<转>
    strcore.cpp(156) 内存泄漏
    WebAssembly相关
    mingw 搭建Emscripten 环境
    mingw 设置python 设置git环境变量
    android平台yuv缩放相关<转>
    多媒体基础知识之PCM数据《 转》
    iOS 5 故事板进阶(2)
  • 原文地址:https://www.cnblogs.com/nulidexuezha/p/4391064.html
Copyright © 2011-2022 走看看