题目描述

给你一个长度为n的数组(1<=n<=1000000),数组中n个元素S 1, S 2, S 3, S 4 … S n(-32768 ≤ S x ≤ 32767)
我们定义函数sum(i,j) = S i + … + S j (1 ≤ i ≤ j ≤ n)
现在给你一个整数m(0< m<=n)你需要求出 y=sum(i 1, j 1) + sum(i 2, j 2) + sum(i 3, j 3) + … + sum(i m, j m) 的最大值,(i x ≤ i y ≤ j x or i x ≤ j y ≤ j x 是不被允许的)
输入
有多组数据,对于每一组数据,只占一行,输入两个数m和n,然后后面输入n个数S 1, S 2, S 3 … S n
输出
对于每组数据,每组输出占一行,每组输出一个数表示y的最大值

样例输入

1 3 1 2 3
2 6 -1 4 -2 3 -2 3

样例输出

6
8

算法:

dp[i][j]代表前j个元素,i个子段的最大和,第i个子段包含第j个元素,a[j]代表第j个元素值。
所以动态规划方程为:dp[i][j]=MAX{ dp[i][j-1] + a[j] , MAX{ dp[i-1][i~j-1] } + a[j] } 要么把第j个元素加到第i个子段里,要么把第j个元素当作 i子段的第一个元素。
优于m未知,空间复杂程度O(m*n*n)所以,要再优化。
dp[i][j]只与dp[i][j-1]和dp[i-1][i~j-1]有关。所以我们用dp和mmax两个一维数组去存储dp[i]和dp[i-1]。
我们只要保存下dp[i-1,i~j-1]的最大值就不用再去寻找了,因为在寻找第i个子段时,mmax[j-1]用过一次后下次不用了,只有在寻找i+1子段时才用到,所以用过后修改mmax[j-1],使其存储dp[i~j-1]的最大值,以便下次寻找i+1子段时可以快速取用。

代码实现:

#include <stdio.h>
#include <string.h>
int a[1000009];
int dp[1000009];
int mmax[1000009];
int max(int a,int b)
{if(a>b){ return a;}else {return b;}
}
int main()
{int m,n;int max_num;int i,j,k;while(~scanf("%d%d",&m,&n)){memset(dp,0,sizeof(dp));memset(mmax,0,sizeof(mmax));for(i=1;i<=n;i++){scanf("%d",&a[i]);}for(i=1;i<=m;i++){max_num=-10000000;for(j=i;j<=n;j++){dp[j]=max(dp[j-1]+a[j],mmax[j-1]+a[j]);mmax[j-1]=max_num;max_num=max(max_num,dp[j]);}}printf("%d\n",max_num);}return 0;
}

1486【动态规划★★】Max Sum Plus Plus.(求n个数m个不相交子段的最大和)相关推荐

  1. HDU 1024 Max Sum Plus Plus

    本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题. 读完题就能看出要用DP,但是因为m的范围没有限定,= =加上自己太菜不知道怎么写, 总之先膜拜大佬http://www.cnblo ...

  2. Max Sum Plus Plus HDU - 1024(动态规划求最大M子段和)

    题意: ----最大M子段和问题 给定由 n个整数(可能为负整数)组成的序列以及一个正整数 m,要求确定序列的 m个不相交子段,使这m个子段的总和达到最大,求出最大和. 题目: Now I think ...

  3. 动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]

    Max Sum Plus Plus HDU - 1024 题意大致是说给你你个序列,把它划分成不相交的几个连续的部分,然后把这个几个部分求和,求出和的最大值. 我们定义子结构  dp[i][j]  表 ...

  4. HDU 1024 Max Sum Plus Plus 动态规划

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目大意:n个数分成两两不相交的m段,求使这m段和的最大值. 解题思路:比较坑的点:n2 能过: ...

  5. 杭电60题--part 1 HDU1003 Max Sum(DP 动态规划)

    最近想学DP,锻炼思维,记录一下自己踩到的坑,来写一波详细的结题报告,持续更新. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem ...

  6. HDU-1003 Max Sum(动态规划)

    题目回顾(HDU-1003): Max Sum Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is t ...

  7. HD 1003 Max Sum (最大字段和问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem Description Given a sequence a[1],a[2],a ...

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

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): ...

  9. 整数行hdu 1244 Max Sum Plus Plus Plus(dp)

    废话就不多说了,开始... Max Sum Plus Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

最新文章

  1. 不同浏览器对URL最大长度的限制
  2. pb分组数据累计_A轮公司数据分析面试经验
  3. LeetCode Number of Islands(flood fill)
  4. ubuntu网络配置
  5. java中如何将非整数保留到小数点后指定的位数
  6. C语言实用算法系列之学生管理系统_对整个结构体操作_冒泡排序
  7. 织梦php重新安装教程,织梦CMS系统后台重装的操作教程
  8. pickle模块的基本使用
  9. 技术周刊(2019-02-11 Serverless)
  10. 60-50-010-API-Kafka producer拦截器(interceptor)
  11. 这款IDEA插件刷爆了技术群,群友:这用起来真酸爽~
  12. React中最基础的jsx语法
  13. C语言pid算法模糊控制,温度PID模糊控制的算法完整
  14. cosx sinx 泰勒展开 C++
  15. 花花世界花家姐 舒淇:花花世界花我不会倒追
  16. php怎么使用sendcloud,请教大牛们 PHPHub 使用 sendcloud 发送邮件需要怎么配置?
  17. Xiuno BBS 4.0 修改时间显示
  18. [散分] 眼见为实?_眼见为实
  19. AVI 文件格式分析
  20. Java第十章总结集合类

热门文章

  1. 关于“无人直播”看这一篇就够了
  2. java 职级评定申报_职级评定方案.doc
  3. 如何将XLSM文件转换成XLSX格式
  4. android语音机器人代码,Android studio开发小型对话机器人app(实例代码)
  5. 《住在隔壁的大学生小夫妻—究竟是谁,弄脏了我们的世界?》--我们的心灵需要净化...
  6. 所付出的努力终不会被辜负~江南大学计算机初试考研经验分享
  7. linux yum国内下载源
  8. ubuntu查看服务器系统型号,Ubuntu Linux系统下查看服务器工作记录分享
  9. java中人民币的符号怎么打_Java学习笔记---字符串操作(人民币大写转换的实现)...
  10. 原生servlet使用fileupload获取不到数据