【算法】利用动态规划实现最大子段和

描述

【算法】利用动态规划实现最大子段和_第1张图片
【算法】利用动态规划实现最大子段和_第2张图片
【算法】利用动态规划实现最大子段和_第3张图片

代码

#include
using namespace std;
#define NUM 1001
int a[NUM];
int MaxSum(int n)
{
     
    int sum=0;
    int b=0;
    for (int i=1; i<=n; i++)
    {
     
        if (b>0)
            b+=a[i];
        else
            b=a[i];
        if (b>sum)
            sum=b;
    }
    return sum;
}

int main()
{
     
    int n;
    while (cin>>n && n)
    {
     
        for (int i=1; i<=n; i++)
            cin>>a[i];
        cout<< MaxSum(n);
    }
    return 0;
}

时间复杂度O(n)

求最优解

【算法】利用动态规划实现最大子段和_第4张图片

#include 
using namespace std;
#define NUM 1001
int a[NUM];
int MaxSum(int n, int &besti, int &bestj)
{
     
    int sum=0;
    int b=0;
    int begin = 0;
    for (int i=1; i<=n; i++)
    {
     
        if (b>0)
            b+=a[i];
        else
        {
     
            b=a[i];
            begin = i;
        }
        if (b>sum)
        {
     
            sum = b;
            besti = begin;
            bestj = i;
        }
    }
    return sum;
}

int main()
{
     
    int n;
    int besti, bestj;
    while (cin>>n && n)
    {
     
        besti = 0;
        bestj = 0;
        for (int i=1; i<=n; i++)
            cin>>a[i];
        cout<<MaxSum(n, besti, bestj)<<endl;
        cout<<"From "<<besti<<" to "<<bestj<<endl;
    }
    return 0;
}


你可能感兴趣的:(算法设计与分析)