怎么能忘了!!!

导航

求数组中的最大子数组1

题目要求:
      (1)输入一个整形数组,数组里有正数也有负数。
      (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
      (3)求所有子数组的和的最大值。要求时间复杂度为O(n)

 

题目实现方法:(1)暴力求解     (2)分治算法       (3)动态规划算法

(3)动态规划算法:

       设计思路:

                  设数组为A[],先求的数组A[0]到A[j]中的最大子数组及最大子数组的和SUM;再根据SUM的值,求得数组A[0]到A[j+1]的最大子数组以及最大子数组的和。按照此步骤,一直求到数组A[]的最后一个数为止。

        

#include<iostream>
#include<string>
using namespace std;

int main()
{
    //动态规划的方法
    int intArray[100];     //输入数据的数组
    int intNum;            //用户输入的数量限制
    int intPre;            //记录最大子数组中的第一个数的位置
    int intAfter;          //记录最大子数组中的最后一个数的位置
    int intSum;            //最大值,记录的是最大子数组的最大值
    int intCurSum;         //当前最大值
    intSum = -65535;
    intCurSum = 0;

    intNum = 0;
    cout << "请输入数组(最大不要超过100个数):" << endl;
    for (int i = 0; i < 100; i++)
    {
        if (cin.peek() == 10)
        {
            cin.clear();
            break;
        }
        cin >> intArray[i];
        intNum++;
    }

    intPre = 0;            //初始化最大子数组的第一个数的位置为0
    for (int i = 0; i < intNum; i++)
    {
        intCurSum = intCurSum + intArray[i];
        if (intCurSum>intSum)
        {
            intSum = intCurSum;
            intAfter = i;
        }
        if (intCurSum < 0)
        {
            intSum = 0;
            intCurSum = 0;
            intPre = i+1;
        }
    }
    
    cout << "最大的子数组为:";
    for (int i = intPre; i <= intAfter; i++)
    {
        cout << intArray[i] << " ";
    }
    cout << endl;
    cout << "最大的子数组的和为:" << intSum << endl;

    return 0;
}

 

 

实验截图:

 

 

 

posted on 2016-03-25 22:00  抬头看见阳光  阅读(278)  评论(1编辑  收藏  举报