zoukankan      html  css  js  c++  java
  • Max Sum Plus Plus

    Max Sum Plus Plus

    题目描述

    传送门

    求m个不相交子段和最大值

    题解

    首先明白每个元素的状态。要么加入前一个块,要么自己成一个组。

    s[i][j]表示前j个元素分成i组的最大值,则转移方程为:

    s[i][j]=max(s[i][j-1]+a[j],max(s[i-1][k]+a[j]));其中k大于等于i-1并且<j

    发现n=1000000,m未知,m稍大会报内存。

    考虑优化,发现当当前元素独立成一组i时,我们只需要在它前面第i-1组中取一个最大的

    就可以,这个操作我们可以边处理边记录前面的MAX,我们还可以用dp[j]表示第j个元素加入

    所选的最大值。

    代码

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    #define INF 0x7fffffff
    int n,m,ansmax;
    int a[1000009],dp[1000009],premax[1000009];
    int main(){
        while(scanf("%d%d",&m,&n)!=EOF){
            memset(dp,0,sizeof(dp));
            memset(premax,0,sizeof(premax));
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
            }
            for(int i=1;i<=m;i++){
                ansmax=-INF;
                for(int j=i;j<=n;j++){
                    dp[j]=max(dp[j-1]+a[j],premax[j-1]+a[j]);
                    premax[j-1]=ansmax;
                    ansmax=max(ansmax,dp[j]);
                }
            }
            printf("%d
    ",ansmax);
        }
        return 0;
    }
  • 相关阅读:
    P1247 取火柴游戏 (奇异局势)
    1290A
    P1236 算24点
    LCP 4. 覆盖
    leetcode 1066. 校园自行车分配 II
    hdu 2255 奔小康赚大钱
    NC200546 回文串
    上市是什么意思 为什么上市就有钱了
    主板、中小板、创业板、新三板的区别是什么?
    熔断机制
  • 原文地址:https://www.cnblogs.com/zzyh/p/7421585.html
Copyright © 2011-2022 走看看