zoukankan      html  css  js  c++  java
  • 洛谷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; 
    }
  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    数论12——浅谈指数与对数
    数论11——大组合数
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10788973.html
Copyright © 2011-2022 走看看