zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和(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;
    }

    运行程序截图:

    合作照片:

    遇到的问题:

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

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

  • 相关阅读:
    Linux中常用操作命令
    JQuery Each循环遍历每个元素
    get set
    Launch Screen在iOS7/8中的实现
    程序猿必备的Git教程
    浏览器的工作原理:新式网络浏览器幕后揭秘
    浏览器的工作原理:新式网络浏览器幕后揭秘
    游览器中javascript的执行过程
    游览器中javascript的执行过程
    浅析 Cordova for iOS
  • 原文地址:https://www.cnblogs.com/amnavov/p/9904756.html
Copyright © 2011-2022 走看看