『最大M子段和 线性DP』
<更新提示>
<第一次更新>
<正文>
最大M子段和(51nod 1052)
Description
N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的。如果M >= N个数中正数的个数,那么输出所有正数的和。
例如:-2 11 -4 13 -5 6 -2,分为2段,11 -4 13一段,6一段,和为26。
Input Format
第1行:2个数N和M,中间用空格分隔。N为整数的个数,M为划分为多少段。(2 <= N , M <= 5000)
第2 - N+1行:N个整数 (-10^9 <= a[i] <= 10^9)
Output Format
输出这个最大和
Sample Input
7
2
-2
11
-4
13
-5
6
-2
Sample Output
26
解析
还是序列最优值问题,很明显是线性DP。不过这一次的状态设置比较裸。
\(f[i][j]\)表示把序列的前\(j\)个元素分为\(i\)段的最大和,其中必须包括第\(j\)个元素。
那么这就成了一道如何优化DP转移的问题。最暴力的思路当然是考虑两种情况:
1.第j个元素和之前的若干元素分入同一个段。
2.第j个元素分入新的一个段。
那么状态转移方程就是:
\]
这是一个经典的决策集合优化DP模型。
注意到,当外层循环\(i\)不变时,随着\(j\)的增加,\(k\)的取值范围也只在原来的基础上增加,那么我们就可以使用决策集合优化,这里选择最简单的一种讲解。
由于第2中情况需要调用到\(max\{f[i-1][k]\}(k<j)\),那么我们就设\(Maxf[i][j]\)代表\(f\)数组中第一维为\(i\)时,第二维前\(j\)个值的最大值。
此时,很容易发现我们可以在更新\(f\)时顺带更新\(Maxf\),以便下一次更新\(f\)时调用,这样就优化了一重循环,这就是决策集合优化。
最后一个问题,爆int,开longlong解决,爆空间,滚动数组解决。
滚动数组不再详细讲解。
\(Code:\)
#include<bits/stdc++.h>
using namespace std;
inline void read(long long &k)
{
long long w=0,x=0;char ch;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
k=(w?-x:x);return;
}
const int N=5000+80,M=5000+80;
long long n,m,a[N],f[2][N]={},Maxf[2][N]={},ans=0;
inline void input(void)
{
read(n),read(m);
for(int i=1;i<=n;i++)read(a[i]);
}
inline void dp(void)
{
for(int i=1;i<=m;i++)
{
for(int j=i;j<=n;j++)
{
f[i&1][j]=max(f[i&1][j-1]+a[j],Maxf[i-1&1][j-1]+a[j]);
Maxf[i&1][j]=max(Maxf[i&1][j-1],f[i&1][j]);
}
}
}
int main(void)
{
input();
dp();
printf("%lld\n",Maxf[m&1][n]);
return 0;
}
考点:决策集合优化。
<后记>
『最大M子段和 线性DP』的更多相关文章
- 『土地征用 Land Acquisition 斜率优化DP』
斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer Jo ...
- 『最长等差数列 线性DP』
最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...
- 『玩具装箱TOY 斜率优化DP』
玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...
- 『最短Hamilton路径 状态压缩DP』
状压DP入门 最短Hamilton路径 Description 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamil ...
- 『战略游戏 最大利润 树形DP』
通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...
- 『没有上司的舞会 树形DP』
树形DP入门 有些时候,我们需要在树形结构上进行动态规划来求解最优解. 例如,给定一颗\(N\)个节点的树(通常是无根树,即有\(N-1\)条无向边),我们可以选择任意节点作为根节点从而定义出每一颗子 ...
- HDU1003 最大子段和 线性dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others) ...
- 洛谷P1115 最大子段和 (线性DP)
经典的线性DP例题,用f[i]表示以第i个位置结尾的最大连续子段和. 状态转移方程:f[i]=max(f[i],f[i-1]+a[i]); 这里省去了a数组,直接用f数组读数据,如果f[i-1]< ...
- 线性DP总结(LIS,LCS,LCIS,最长子段和)
做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...
随机推荐
- 2018-2019 20165235 网络对抗 Exp5 MSF基础
2018-2019 20165235 网络对抗 Exp5 MSF基础 1. 实践内容(3.5分) 1.1一个主动攻击实践 攻击方:kali 192.168.21.130 靶机: win7 192.16 ...
- TortoiseSVN--clearup清理失败解决办法
工作中经常遇到update.commit 失败导致冲突问题,需要用clear up来清除问题,个别异常情况导致clear up失败,进入死循环!可以使用sqlite3.exe清理一下wc.db文件的队 ...
- Scrapy框架之CrawlSpider
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...
- 意识科学初步:David Chalmers的简单问题与困难问题
这是第一篇关于意识科学的内容.主要谈一下阅读大卫查莫斯的几篇论文的一些观点和思考. 论文作者简介(摘自wiki): David John Chalmers (born 20 April 1966) i ...
- git逻辑和基本命令
提交和推送的区别 提交(commit):把您做的修改,保存到本地仓库中 推送(push):把您本地仓库的代码推送至服务器(一般是远程服务器及gitlab或github) 拉取和获取的区别 git p ...
- CGI、FastCGI、PHP-FPM联系与区别(理解总结自其他博文)
参考:http://blog.csdn.net/tyrantbear/article/details/52077321 参考:http://mp.weixin.qq.com/s?src=11& ...
- Rabin-Karp ACM训练
求解问题 寻找S中T出现的位置或次数.假设S的长度为n, T的长度为m, 通过枚举S长度为m的字串的hash值与T的hash值比较.此时使用滚动hash的优化使复杂度不为O(mn). 算法说明 滚动h ...
- PeopleSoft OLE Automation error in Workbooks.Open: ObjectDoMethod: Microsoft Excel 不能访问文件
os: WinServer 2012 R2 64位 问题描述:PeopleSoft Web端运行AE 报上图错误,AD工具直接Test正常 解决方案: 运行> dcomcnfg 这将打开组件服务 ...
- python学习:continue及break使用
continue及break使用 #continue 作用:结束本次循环,继续下次循环#break 作用:跳出整个当次循环 for i in range(10): if i < 5: conti ...
- python多线程和多进程使用
# 多线程 from concurrent.futures import ThreadPoolExecutor # 多进程 from concurrent.futures import Process ...