dp第三题

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
    int n;
    int a[105];
    int dp[105];
    while(cin >> n)
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            cin >> a[i];
        }
        for(int i=1;i<=n;i++)
        {
            if(dp[i-1]>0)
            {
                dp[i]=dp[i-1]+a[i];
            }
            else
            {
                dp[i]=a[i];
            }
        }
        int max=-1000;
        for(int i=1;i<=n;i++)
        {
            if(dp[i]>max)
            {
                max=dp[i];
            }
        }
        cout << max << endl;
    }
    return 0;
}

已知有一个序列{Ai},其中都是整数,但不一定为正数,请求出其中连续的一段子串,使得这个子串的所有值相加的和最大,子串不允许为空。(最大子段和)

状态:dp[i]代表包含i点,且不包含i+1及之后的点,的子串中的最大和。

状态转移方程:dp[i-1]>0?dp[i]=dp[i-1]+a[i]:dp[i]=a[i];

原文地址:https://www.cnblogs.com/markliu/p/2496726.html