• 洛谷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; 
    }
  • 相关阅读:
    第二章 java内存区域与内存溢出异常
    TCP实现可靠传输
    Tomcat的类加载架构
    浅析Synchronized
    设计数据库
    http和https
    IOC容器的依赖注入
    IOC容器初始化
    深入理解Java内存模型
    单例应该这么写
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10788973.html
Copyright © 2020-2023  润新知