【题解】最大 M 子段和 Max Sum Plus Plus [Hdu1024] [51nod1052]
【题解】最大 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]的更多相关文章
- 最大子段和(Max Sum)
Max Sum. The following is an instance. a) (-2,11,-4,13,-5,-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 ...
- HDOJ-1003 Max Sum(最大连续子段 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...
- [ACM] hdu 1003 Max Sum(最大子段和模型)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- (最大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/ ...
- HDU 1003:Max Sum(DP,连续子段和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 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 ...
- 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/ ...
- hdu 1024 Max Sum Plus Plus (子段和最大问题)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- 如何修改被readonly修饰的属性
结论: 1.用KVC改变只读属性的值: 2.若禁止KVC方式修改只读属性的值,可在对应类重写类方法 // 该方法默认返回YES. 即在不存在满足条件的存取方法时,允许直接访问属性对应的实例变量+ (B ...
- notepad++ 设置运行python脚本
按F5 在输入框中输入: cmd /k python “$(FULL_CURRENT_PATH)” &PAUSE & EXIT python路径必须在环境变量中. 否则需要输入完整的p ...
- Shell 编程 正则表达式
本篇主要写一些shell脚本正则表达式的使用基础. 概述 正则表达式分为基础正则表达式(Regular Expression)与扩展正则表达式(Extended Regular Expression) ...
- python将Excel文件内容导入Mysql数据
为了方便起见,将所有字段类型设置为str,理解mysql的语法这个玩意贼简单 # _*_ coding:utf-8 _*_import pandas as pd #先装个pandas ,pip ins ...
- 性能测试基础---ant集成2
·自定义报告模板:因为默认的ant提供的报告模板,是没有tps和90%line这样的数据.但是在实际工作中,这两个统计数据又是必须的,那么我们可以通过自定义(修改)的方式来进行修改,达到我们的目的. ...
- Python并发编程内容回顾
Python并发编程内容回顾 并发编程小结 目录 • 一.到底什么是线程?什么是进程? • 二.Python多线程情况下: • 三.Python多进程的情况下: • 四.为什么有这把GIL锁? • 五 ...
- andrlid 处理大图片思路,未实践
Loading Large Bitmaps Efficiently 先不解码,读取image的宽高,然后降采样显示图片. 参考:http://developer.android.com/trainin ...
- VIJOS-P1152 肥猫的游戏
洛谷 P1488 肥猫的游戏 洛谷传送门 JDOJ 1314: VIJOS-P1152 肥猫的游戏 JDOJ传送门 Description 野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高 ...
- 排序算法-希尔排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className ShellSort * @date 201 ...
- OpenCV 学习笔记(15)openc解帧视频
1 修改读取视频的地址 2 修改保存图片序列的路径 String videopath = "F:/dongdong/0tool/3D/2模型/相机阵列/1_12cam亿级相机/数据/giga ...