• 返回一个整数数组中最大子数组的和(2)


     题目:
    返回一个整数数组中最大子数组的和。
    要求:
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
    同时返回最大子数组的位置。
    求所有子数组的和的最大值。
    设计思路:

    我们根据只有前半部分的和为正数时,才有可能在子数组求和的时候可能最大,算法是当从头开始,遍历的元素求和为正数时,继续向后遍历,当求和为负数时,重新开始计算求和,子数组的开始重置为下一个元素要求。

    程序:

    #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() != ' ')
    {
    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;
    }

    运行程序截图:

    合作照片:

    遇到的问题:

    程序不知道怎么返回最大数组的位置。

    总结:这项作业参考了网上前辈的程序,并根据自己的思路和课上老师讲授的思路进行编程,同伴主要负责调试代码,调试工作复杂,编写代码的工作更是没有头绪,还好最后经过一起努力完成作业。

  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/amnavov/p/9904756.html
Copyright © 2020-2023  润新知