题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024

题目大意:有多组输入,每组一行整数,开头两个数字m,n,接着有n个数字。要求在这n个数字上,m块数字的最大和。比如2 6 -1 4 -2 3 -2 3,就是(4 -2 3)和(3)这两块最大和为8。

解题思路:当成有m层,我们可以设置两个数组dp,mpre。dp[j]记录当前这一层包含a[j]时的最大值(包含a[j]),mpre[j]个记录上一层到第j-1个位置时的最大和(不一定包含a[j])。这样写出状态转移方程dp[j]=max(dp[j-1],mpre[j-1])+a[j]。表示选择接着这一层j上一个+a[j],或这上一层j-1这个位置取最大值的状态+a[j]。

举个例子2 8 -1 4 -2 3 -10 3 -2 3,在i=2,j=8时,此时dp[8]=max(dp[7],mpre[7])。dp[7]=6表示(4 -2 3)+(3 -2)这两块的和,mpre[7]=5表示(4 -2 3)这一块的和,选择dp[8]=dp[7]+a[j]=0相当于(4 -2 3)+(3 -2 3)这两块的和。

推广一下,在第m层时,mpre[j-1]表示在j-1这个位置m-1块的最大和,如果选择mpre[j-1]+a[j]相当于a[j]为一块,mpre[j-1]为m-1块加起来就是j位置m块时的最大值。

同理dp[j-1]是包含了a[j-1]的在j-1这个位置m块的最大和,如果选择dp[j-1]+a[j]相当于a[j],a[j-1]....一直到上一次选择mpre为止算一块(或者到第m-1个,可能没有选择过mpre),前面的有m-1块,加起来也是j位置m块时的最大值。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long LL;
  6. const int N=1e6+;
  7. const LL inf=1e18;
  8.  
  9. LL a[N],dp[N],pre[N];
  10.  
  11. int main(){
  12. int m,n;
  13. while(~scanf("%d%d",&m,&n)){
  14. memset(dp,,sizeof(dp));
  15. memset(pre,,sizeof(pre));
  16. for(int i=;i<=n;i++)
  17. scanf("%lld",&a[i]);
  18. LL tmp;
  19. for(int i=;i<=m;i++){
  20. tmp=-inf;
  21. for(int j=i;j<=n;j++){
  22. dp[j]=max(dp[j-]+a[j],pre[j-]+a[j]);
  23. pre[j-]=tmp;
  24. tmp=max(tmp,dp[j]);
  25. }
  26. }
  27. printf("%lld\n",tmp);
  28. }
  29. return ;
  30. }

HDU 1024 Max Sum Plus Plus(dp)的更多相关文章

  1. HDU 1024 Max Sum Plus Plus (动态规划)

    HDU 1024 Max Sum Plus Plus (动态规划) Description Now I think you have got an AC in Ignatius.L's "M ...

  2. HDU 1024 Max Sum Plus Plus(DP的简单优化)

    Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To b ...

  3. HDU 1024:Max Sum Plus Plus(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Problem Description Now I think you ...

  4. 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/ ...

  5. HDU 1024 Max Sum Plus Plus(基础dp)

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

  6. HDU 1024 Max Sum Plus Plus【DP】

    Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...

  7. 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 ...

  8. hdu 1024 Max Sum Plus Plus(简单dp)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意:给定一个数组,求其分成m个不相交子段和的最大值. 这题有点问题其实m挺小的但题目并没有给出 ...

  9. HDU 1024 Max Sum Plus Plus【DP,最大m子段和】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意: 给定序列,给定m,求m个子段的最大和. 分析: 设dp[i][j]为以第j个元素结尾的 ...

随机推荐

  1. Spring Boot系列教程六:日志输出配置log4j2

    一.前言  spring boot支持的日志框架有,logback,Log4j2,Log4j和Java Util  Logging,默认使用的是logback日志框架,笔者一直在使用log4j2,并且 ...

  2. 常用Actoin算子 与 内存管理 、共享变量、内存机制

    一.常用Actoin算子 (reduce .collect .count .take .saveAsTextFile . countByKey .foreach ) collect:从集群中将所有的计 ...

  3. 「CodePlus 2017 11 月赛」可做题

    这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...

  4. POJ2234:Matches Game(Nim博弈)

    Matches Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12325   Accepted: 7184 题目链 ...

  5. python访问需要登录的网页

    有些网页需要你登录之后才可以访问,你需要提供账户和密码. 只要在发送http请求时,带上含有正常登陆的cookie就可以了. 1.首先我们要先了解cookie的工作原理. Cookie是由服务器端生成 ...

  6. mac pro电脑怎么安装rabbitmq

    第一:依次执行以下命令: 1.  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst ...

  7. python 学习笔记(十二) 文件和序列化

    python 文件读写和序列化学习.## python文件读写`1 打开并且读取文件` f = open('openfile.txt','r') print(f.read()) f.close() ` ...

  8. re正则模块

    1.正则表达式的常用符号 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上 ...

  9. C++ string类析构报错

    我项目中用到了字符串的Base64转码.DES解密等功能,可能DES解密算法只能解密8字节倍数长度的字符串,所以我得到的结果总会存在一个多余的“尾巴”,于是我想要做一个字符串尾部清理的工作.我的做法是 ...

  10. 【机器学习】K-邻近算法的python 实现

    #!/usr/bin/python # -*- coding: utf-8 -*- from numpy import * import operator def createDataSet(): ' ...