C++动态规划计算最大子数组

 更新时间:2022年06月30日 10:35:57   作者:成就一亿技术人  
所谓最大子数组就是连续的若干数组元素,如果其和是最大的,那么这个子数组就称为该数组的最大子数组

例题

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

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

1.求最大的子数组的和

代码【C++】

#include <iostream>
using namespace std;
/
// Find the greatest sum of all sub-arrays
// Return value: if the input is valid, return true, otherwise return false
/
bool FindGreatestSumOfSubArray
    (
    int *pData,           // an array
    unsigned int nLength, // the length of array
    int &nGreatestSum     // the greatest sum of all sub-arrays
    )
{
    // if the input is invalid, return false
    if((pData == NULL) || (nLength == 0))
        return false;
    int nCurSum = nGreatestSum = 0;
    for(unsigned int i = 0; i < nLength; ++i)
    {
        nCurSum += pData[i];
        // if the current sum is negative, discard it
        if(nCurSum < 0)
            nCurSum = 0;
        // if a greater sum is found, update the greatest sum
        if(nCurSum > nGreatestSum)
            nGreatestSum = nCurSum;
    }
    // if all data are negative, find the greatest element in the array
    if(nGreatestSum == 0)
    {
        nGreatestSum = pData[0];
        for(unsigned int i = 1; i < nLength; ++i)
        {
            if(pData[i] > nGreatestSum)
                nGreatestSum = pData[i];
        }
    }
    return true;
}
int main()
{
    int arr[] = {1, -2, 3, 10, -4, 7, 2, -5};
    int iGreatestSum;
    FindGreatestSumOfSubArray(arr, sizeof(arr)/sizeof(int), iGreatestSum);
    cout << iGreatestSum << endl;
    return 0;
}

结果

2.求和最大的相应子数组

代码【C++】

#include <iostream>
using namespace std;
/
// Find the greatest sum of all sub-arrays
// Return value: if the input is valid, return true, otherwise return false
/
bool FindGreatestSumOfSubArray
    (
    int *pData,           // an array
    unsigned int nLength, // the length of array
    int &nGreatestSum,    // the greatest sum of all sub-arrays
    int &start,                            // Added
    int &end                            // Added
    )
{
    // if the input is invalid, return false
    if((pData == NULL) || (nLength == 0))
        return false;
    int nCurSum = nGreatestSum = 0;
    int curStart = 0, curEnd = 0;        // Added
    start = end = 0;                    // Added
    for(unsigned int i = 0; i < nLength; ++i)
    {
        nCurSum += pData[i];
        curEnd = i;                        // Added
        // if the current sum is negative, discard it
        if(nCurSum < 0)
        {
            nCurSum = 0;
            curStart = curEnd = i + 1;    // Added
        }
        // if a greater sum is found, update the greatest sum
        if(nCurSum > nGreatestSum)
        {
            nGreatestSum = nCurSum;
            start = curStart;            // Added
            end = curEnd;                // Added
        }
    }
    // if all data are negative, find the greatest element in the array
    if(nGreatestSum == 0)
    {
        nGreatestSum = pData[0];
        start = end = 0;                // Added
        for(unsigned int i = 1; i < nLength; ++i)
        {
            if(pData[i] > nGreatestSum)
            {
                nGreatestSum = pData[i];
                start = end = i;        // Added
            }
        }
    }
    return true;
}
int main()
{
    int arr[] = {1, -2, 3, 10, -4, 7, 2, -5};
    int iGreatestSum, start, end;
    FindGreatestSumOfSubArray(arr, sizeof(arr)/sizeof(int), iGreatestSum, 
        start, end);
    cout << iGreatestSum << ": ";
    for(int i = start; i <= end; i++)
    {
        cout << arr[i] << " ";
    }
    return 0;
}

结果

到此这篇关于C++动态规划计算最大子数组的文章就介绍到这了,更多相关C++最大子数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++最短路径Dijkstra算法的分析与具体实现详解

    C++最短路径Dijkstra算法的分析与具体实现详解

    经典的求解最短路径算法有这么几种:广度优先算法、Dijkstra算法、Floyd算法。本文是对 Dijkstra算法的总结,该算法适用于带权有向图,可求出起始顶点到其他任意顶点的最小代价以及对应路径,希望对大家有所帮助
    2023-03-03
  • C++文件读写代码分享

    C++文件读写代码分享

    本文给大家分享的是2个C++实现文件读写的代码,都非常的简单实用,有需要的小伙伴可以参考下。
    2015-07-07
  • C++ boost库的安装过程详解

    C++ boost库的安装过程详解

    这篇文章主要介绍了C++ boost库的安装过程详解,文中通过示例代码和图片介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C语言实现的猴子分桃问题算法解决方案

    C语言实现的猴子分桃问题算法解决方案

    这篇文章主要介绍了C语言实现的猴子分桃问题算法,较为详细的分析了猴子分桃问题算法的原理与通过递归算法解决问题的相关实现技巧,需要的朋友可以参考下
    2016-10-10
  • c++代码各种注释示例详解

    c++代码各种注释示例详解

    大家好,本篇文章主要讲的是c++代码各种注释示例详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言中位运算符"|"的5种高级用法总结

    C语言中位运算符"|"的5种高级用法总结

    这篇文章主要为大家详细介绍了C语言中位运算符"|"的5种高级用法,文中的示例代码讲解详细,具有一定的参考价值,需要的可以参考一下
    2023-04-04
  • C++实现比特币系统的源码

    C++实现比特币系统的源码

    这篇文章主要介绍了C++实现比特币系统的源码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • C语言详细讲解strcpy strcat strcmp函数的模拟实现

    C语言详细讲解strcpy strcat strcmp函数的模拟实现

    这篇文章主要介绍了怎样用C语言模拟实现strcpy与strcat和strcmp函数,strcpy()函数是C语言中的一个复制字符串的库函数,strcat()函数的功能是实现字符串的拼接,strcmp()函数作用是比较字符串str1和str2是否相同
    2022-05-05
  • C++ 数据共享与保护

    C++ 数据共享与保护

    C++ 数据共享与保护的基本概念,包括标识符的作用域与可见性,对象生存期,类数据的共享,类共享数据的保护。本篇文章就介绍C++ 数据共享与保护,需要的朋友可以参考一下
    2021-10-10
  • C语言函数多个返回值方式

    C语言函数多个返回值方式

    这篇文章主要介绍了C语言函数多个返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论