洛谷P1115 最大字段和【线性dp】

题目https://www.luogu.org/problemnew/show/P1115

题意:

求给定数组的最大区间和。

思路:

$dp[i][0]$表示以1~i的数组,不选i的最大字段和。$dp[i][1]$表示1~i的数组,选了i 的最大字段和。

显然有 $dp[i+1][0] = max(dp[i][0], dp[i][1])$和$dp[i+1][1] = max(dp[i][1] + num[i], num[i])$

要注意所有的数字都是负数的情况,特判一下。

#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath> 
#include<stack>
#include<queue>

#define inf 0x7fffffff
using namespace std;
typedef long long LL;
typedef pair<string, string> pr;


int n;
const int maxn = 2e5 + 5;
int num[maxn];
int dp[maxn][2];

int main()
{
    scanf("%d", &n);
    bool allminus = true;
    int mx = -10005;
    for(int i = 0; i < n; i++){
        scanf("%d", &num[i]);
        if(num[i] >= 0)allminus = false;
        mx = max(mx, num[i]);
    }
    dp[0][0] = 0;
    dp[0][1] = num[0];
    
    for(int i = 1; i < n; i++){
        dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
        dp[i][1] = max(dp[i - 1][1] + num[i], num[i]);
    }
    
    if(allminus)printf("%d
", mx);
    else printf("%d
", max(dp[n - 1][0], dp[n - 1][1]));
    
    return 0; 
}
原文地址:https://www.cnblogs.com/wyboooo/p/10788973.html