洛谷 最大子段和 (动态规划入门问题)

题目描述

给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。

输入格式

第一行是一个整数,表示序列的长度 n。

第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai​。

输出格式

输出一行一个整数表示答案。

输入输出样例

输入 

7
2 -4 3 -1 2 -4 3

输出 

4

说明/提示

样例 1 解释

选取 [3,5] 子段 {3,−1,2},其和为 4。

数据规模与约定
  • 对于 40% 的数据,保证 n≤2×103。
  • 对于 100% 的数据,保证 1≤n≤2×105,−104≤ai​≤104。

代码:

#include
#define MX 200005 //注意数据范围
using namespace std;
int dp[MX],mx,a[MX];//dp[i]表示以a[i]结尾的最大子段和 
int main() {
    int n;
    cin>>n;
    for(int i = 1;i <= n;i++)
    {
        cin>>a[i];
    }
    dp[1] = a[1];
    mx = dp[1];
    int i;
    for(i = 2;i <= n;i++)
    {
        if(dp[i-1] > 0)
        {
            dp[i] = dp[i - 1] + a[i];//子段和之间的关系 
        }
        else{
            dp[i] = a[i];
        }
        mx = max(mx,dp[i]);
    }
    cout<     return 0;
}

你可能感兴趣的:(算法练习,动态规划,算法)