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

     一.题目:

    要求程序必须能处理1000 个元素;

    每个元素是int32 类型的;

    输入一个整形数组,数组里有正数也有负数。

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

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

    二.思路分析:

    1.我们先建立一个新的二维数组b[n][m]

      二维数组b[j][k] 存放的是a[j][k](0<=j<n,0<=k<m) 这一点到 a[0][0]  的最大值

    2.具体循环工作:

           当循环到a[j][k](0<=j<n,0<=k<m),则求的是 a[j][k]到 a[0][0]  的最大值

    3.计算方法:

               b[j][k]=a[j][k]+b[j-1][k]+b[j][k-1]-b[j-1][k-1],若b[j][k]<0,则赋值为0;每次计算完成后,都需要与max进行比较。

    三.代码:

    #include<iostream>
    using namespace std;
    
    int main()
    {
        int i,j;
        int a[3][3]={-1,-2,1,-3,4,2,3,20,-5};
        int b[3][3];
        int max=a[0][0];
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                cout<<a[i][j]<<'	';
            }
            cout<<endl;
        }
        for(i=0;i<1;i++)
        {
            b[0][0]=a[0][0];
            for(j=0;j<3;j++)
            {
                if(a[0][j-1]<0)
                {
                    b[0][j]=a[0][j];
                }
                else
                {
                    b[0][j]=b[0][j-1]+a[0][j];
                }
            }
        }
        for(i=1;i<3;i++)
        {
            for(j=0;j<1;j++)
            {
                if(a[i-1][0]<0)
                {
                    b[i][0]=a[i][0];
                }
                else
                {
                    b[i][0]=b[i-1][0]+a[i][0];
                }
            }
        }
        for(i=1;i<3;i++)
        {
            for(j=1;j<3;j++)
            {
                if(b[i-1][j-1]<0)
                {
                    if(b[i-1][j]>=0&&b[i][j-1]>=0)
                    {
                        if(b[i][j-1]>=b[i-1][j])
                        {
                            b[i][j]=b[i][j-1]+a[i][j];
                        }
                        else
                        {
                            b[i][j]=b[i-1][j]+a[i][j];
                        }
                    }
                    else if(b[i-1][j]>=0&&b[i][j-1]<=0)
                    {
                        b[i][j]=b[i-1][j]+a[i][j];
                    }
                    else if(b[i-1][j]<=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=b[i][j-1]+a[i][j];
                    }
                    else
                    {
                        b[i][j]=a[i][j];
                    }
                }
                else
                {
                    if(b[i-1][j]>=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
                    }
                    else if(b[i-1][j]>=0&&b[i][j-1]<=0)
                    {
                        b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
                    }
                    else if(b[i-1][j]<=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
                    }
                    else
                    {
                        b[i][j]=a[i][j];
                    }
                }
            }
        }
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                if(b[i][j]>max)
                max=b[i][j];
            }
        }
        cout<<"最大子数组的和为:"<<max<<endl;
        return 0; 
    }

    四.结果截图:

    五.总结:

         本次设计让我更加深刻的认识到了结对开发的重要性,我和崔鹏勃确定算法以后,在编程的时候遇到了难题,通过讨论将代码实现,比如说我们在循环计算的时候,对如何实现所有的可能性进行了讨论等。

  • 相关阅读:
    如何使用Flash来实现本地存储.续
    一个简单自动监控nginx 504错误的php脚本
    Spark,一种快速数据分析替代方案
    使用浏览器原生函数优化动画
    QWrap简介之核心库定制
    计算tcp每秒并发数一则
    Sina的CMS模型
    Web 2.0 桌面与移动应用程序安全性设计
    FLEXmadel模态窗口透明度设置
    使用 ASM 实现 Java 语言的“多重继承”
  • 原文地址:https://www.cnblogs.com/littilsaber/p/4357743.html
Copyright © 2011-2022 走看看