【题解】最大 M 子段和 Max Sum Plus Plus [Hdu1024] [51nod1052]

传送门:最大 \(M\) 子段和 \(Max\) \(Sum\) \(Plus\) \(Plus\) \([Hdu1024]\) \([51nod1052]\)

【题目描述】

给出一个长度为 \(N\) 的序列 ,将这 \(N\) 个数划分为互不相交的 \(M\) 个子段,并使得 \(M\) 个子段的和最大。

【样例】

样例输入:
7 2
-2
11
-4
13
-5
6
-2 样例输出:
26

【数据范围】

\(100\%\) \(1 \leqslant N \leqslant 10^6\)


【分析】

在 \(51nod\) 里面这道题的数据水出了一种极其诡异的境界,首先是它题目里瞎扯的一个特判没毛用,其次,我尝试了不下 \(10\) 种错误写法(包括不同题意所造成的不同写法),居然全对 \(...\)

设 \(dp[i][j]\) 表示使用前 \(j\) 个数划分了 \(i\) 段的最大和。

由于所选段不一定要连续,所以 \(dp[i][j]=dp[i][j-1]\),即第 \(i\) 段不选 \(a[j]\) 的情况。

如果要选 \(a[j]\) ,那么应该是从 \(a[j]\) 往前选出连续的一段 \([k+1,j]\) 作为第 \(i\) 段,即 \(dp[i][j]=max\{dp[i-1][k]+S[j]-S[k]]\}\),其中 \(k \in[i-1,j-1],\) 为了保证这之后剩下的数可以足够选完 \(m\) 段,需要满足 \(i-j \geqslant m-n\) 即 \(j \in [i,n-m+i]\),\(S[i]\)为 \(a[i]\) 的前缀和 。

开一个滚动数组 \(f\) 优化掉第一维,就成了酱紫: \(dp[j]=\begin{cases} max_{k=i-1}^{j-1}\{f[k]-S[k]]\}+S[j] & j=i\\max\{dp[j-1],{max_{k=i-1}^{j-1}\{f[k]-S[k]]\}+S[j]}\} & j>i \end{cases}\)

对于上面 \(j=i\) 的情况,实际操作时,可以特判,也可以直接 \(dp[i-1]=-inf\) 。

后面那一大堆求最大值的表达式可以直接用一个变量 \(maxs\) 来保存,初始值为 \(f[i-1]-S[i-1]\),每求完一个 \(dp[j]\),就让其与 \(f[j]-S[j]\) 取个最大值,下一次 \(dp[j+1]\) 要使用 \(maxs\) 时,其维护的区间信息恰好为 \([i-1,(j+1)-1]\) 。


【Code】

#include<algorithm>
#include<cstring>
#include<cstdio>
#define LL long long
#define Re register LL
using namespace std;
const int N=1e6+3;
LL n,m,tmp,ans,maxs,S[N],f[N],dp[N];
inline void in(Re &x){
int f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
int main(){
while(scanf("%lld%lld",&m,&n)!=EOF){
for(Re i=1;i<=n;++i)in(S[i]),tmp+=(S[i]>0),S[i]+=S[i-1];
memset(dp,0,sizeof(dp));
memset(f,0,sizeof(f));
for(Re i=1;i<=m;++i){
for(Re j=1;j<=n;++j)f[j]=dp[j];
maxs=f[i-1]-S[i-1];
dp[i-1]=-1e18;
for(Re j=i;j<=n-m+i;++j){
dp[j]=max(dp[j-1],maxs+S[j]);
maxs=max(maxs,f[j]-S[j]);
}
}
printf("%lld\n",dp[n]);
}
}

【题解】最大 M 子段和 Max Sum Plus Plus [Hdu1024] [51nod1052]的更多相关文章

  1. 最大子段和(Max Sum)

    Max Sum. The following is an instance. a)    (-2,11,-4,13,-5,-2) 思路: 最大子段和:给定一个序列(元素可正可负),找出其子序列中元素和 ...

  2. HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. HDOJ-1003 Max Sum(最大连续子段 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...

  4. [ACM] hdu 1003 Max Sum(最大子段和模型)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. (最大m子段和) Max Sum Plus Plus (Hdu 1024)

    http://acm.hdu.edu.cn/showproblem.php?pid=1024     Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/ ...

  6. HDU 1003:Max Sum(DP,连续子段和)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  7. HDU 1024:Max Sum Plus Plus(DP,最大m子段和)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. HDU 1024 Max Sum Plus Plus(m个子段的最大子段和)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/ ...

  9. hdu 1024 Max Sum Plus Plus (子段和最大问题)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. 8皇后问题SQL求解(回溯算法)

    问题 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一 ...

  2. 静态资源上传至远程ftp服务器,ftp工具类封装

    工具类,是一个单独的工程项目 提取必要信息至ftp.properties配置文件中 ftp_host=192.168.110.128 ftp_port=21 ftp_username=ftpuser ...

  3. 修改GIT已提交的用户名和邮箱

    修改GIT已提交的用户名和邮箱 原文:https://help.github.com/en/github/using-git/changing-author-info 说明 要更改在现有提交中记录的名 ...

  4. Android Studio总结

    课程背景 相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具,目前很多开源项目都已经在采用,G ...

  5. Windows中的txt文件到Mac打开是乱码 解决办法

    在Mac下打开“文本编辑”程序之后,选择菜单“文本编辑” -> “偏好设置”.2)在“偏好设置”中选择第二个标签页“打开和存储”,选择“纯文本文件编码”中的“打开文件”和“存储文件”修改成为“中 ...

  6. 【oracle】去重

    基本去重: SELECT DISTINCT * FROM TABLE; 其他去重: 待添加

  7. Pandas | 26 疏离数据

    当任何匹配特定值的数据(NaN/缺失值,尽管可以选择任何值)被省略时,稀疏对象被“压缩”. 一个特殊的SparseIndex对象跟踪数据被“稀疏”的地方. 这将在一个例子中更有意义. 所有的标准Pan ...

  8. PATA1012The Best Rank(25分)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  9. PATB1048数字加密

    关于代码都是可以在PAT上跑通的 自己是在VS2017上写的,所以会有语句system("pause");,表示暂定方便查看结果. *在一个是VS2017中使用scanf会报错,所 ...

  10. 三天精通Vue--学前摘要

    Vue Vue是一个前端框架,中文学习教程https://cn.vuejs.org/v2/guide/components.html 学习的前提:一点的 HTML+CSS+js node.js是前端的 ...