这个问题相对于上个问题又复杂了一步,主要在于如何判断 最大子数组和是否在数组首尾处,那么可以选择分情况讨论,最后选择最大值解决

  可以分两个情况:


  1.和最大子数组没有跨过数组首尾

   此时可以使用上一个程序的方法


  2.和最大子数组跨过数组首尾

   此时选择 数组总和-最小子数组和得到最大子数组和


  最后通过比较两个和的大小选择实际和大小.

 

  程序代码:

//可以分两个情况
//1.和最大子数组没有跨过数组首尾
//    此时可以使用上一个程序的方法
//2.和最大子数组跨过数组首尾
//    此时选择 数组总和-最小子数组和得到最大子数组和
//最后通过比较两个和的大小选择实际和大小

#include<iostream>
using namespace std;
int main()
{
    int i,num,Max2Sum,result;
    cout << "请输入数组元素个数: " ;
    cin >> num;
    int *arr = new int[num];
    cout << "请依次输入数组元素" << endl;
    for (i = 0; i < num; i++)
    {
        cin >> arr[i];
    }
    int Sum=0;
    int temp=0 ;
    int CurSum=0;
    int MaxSum=0;
    int MinSum=0;
    for (i = 0; i<num; i++)
    {
        //第二种情况,求得最大值为Sum-MinSum
        Sum+=arr[i];
        if (temp>0)
        {
            temp=arr[i];
        }
        else
        {
            temp=temp+arr[i];
        }
        if (temp<MinSum)
        {
            MinSum=temp;
        }
        //第一种情况,求得最大值为CurSum
        CurSum+=arr[i];
        if(CurSum>MaxSum)
        {
            MaxSum=CurSum;
        }
        if(CurSum<0)
        {
            CurSum=0;
        }
    }
    Max2Sum=Sum-MinSum;
    if(CurSum>Max2Sum)  //较大的为最大值
    {
        result=CurSum;
    }
    else
    {
        result=Max2Sum;
    }
    cout <<"该数组中最大子数组的和是: "<< result<<endl;
    system("pause");
    return 0;
}

 

  程序运行截图(对比上一次程序):

  另一个实验数据:

 posted on 2016-03-27 17:25  呼噜~呼噜  阅读(1805)  评论(1编辑  收藏  举报