返回整数数组的最大子数组的和

#include<iostream>
using namespace std;

int max(int a, int b)  
{
    if (a > b)
    {
        return a;
    }
    else
    {
        return b;
    }
}

int main()
{
    int Array[10000];
    int i = 1,k;
    int dynamic_planning[10000][2], j, sum[10000];
    int start[10000] = {0};                  
    int end[10000] = { 0 };                  
    cout << "请输入数组:" << endl;
    cin >> Array[0];
    while (cin.get() != '\n') 
    {
        cin >> Array[i++];
    }
    for (j = i; j < 2 * i; j++)
    {
        Array[j] = Array[j - i];
    }
    int n = 0;
    while (true){
        dynamic_planning[0][0] = 0;
        dynamic_planning[0][1] = Array[n];
        for (j = 1; j<i; j++)
        {
            dynamic_planning[j][0] = max(dynamic_planning[j - 1][0], dynamic_planning[j - 1][1]);
            dynamic_planning[j][1] = max(Array[j+n], (dynamic_planning[j - 1][1] + Array[j+n]));
           
            if (dynamic_planning[j - 1][1] < dynamic_planning[j][1] && dynamic_planning[j - 1][1]<0 && dynamic_planning[j][0] <= dynamic_planning[j][1])
            {
                start[n] = j+n;
               
            }
            if (dynamic_planning[j - 1][1] >= dynamic_planning[j][0])
            {
                end[n] = j-1+n;
               
            }

            if (dynamic_planning[j][1] >= dynamic_planning[j][0])
            {
                end[n] = j+n;
               
            }

        }
        sum[n] = max(dynamic_planning[i - 1][0], dynamic_planning[i - 1][1]);
        n++;
        if (n == i)
        {
            break;
        }
    }
    int max = sum[0];
    n = 0;
    for (j = 0; j < i; j++)
    {
        if (sum[j]>max)
        {
            max = sum[j];
            n = j;
        }
    }
    cout << "最大的子数组为:" << endl;
    if (start[n] <= end[n])
    {
        for (j = start[n]; j <= end[n]; j++)
        {
            cout << Array[j] << " ";
        }
    }
    else
    {
        for (j = start[n]; j < i; j++)
        {
            cout << Array[j] << " ";
        }
        for (j = 0; j <= end[n]; j++)
        {
            cout << Array[j] << " ";
        }
    }
    cout << endl;
    cout << "开始检索: " << start[n];
    if (end[n] >= i)
        cout << "结束检索: " << end[n] - i;
    else
        cout << "结束检索: " << end[n];
    cout << endl;
    //cout << start << " " << end << endl;
    
    cout << "最大的子数组的和为:" << sum[n] << endl;
    return 0;
}

设计思路:我们根据只有前半部分的和为正数时,才有可能在子数组求和的时候可能最大,算法是当从头开始,遍历的元素求和为正数时,继续向后遍历,当求和为负数时,重新开始计算求和,子数组的开始重置为下一个元素要求。这个作业不容易,是我们一点一点查书和查网上的代码改编的,要加强c基础语句的应用。

猜你喜欢

转载自www.cnblogs.com/chenvc/p/9904137.html
今日推荐