1486【动态规划★★】Max Sum Plus Plus.(求n个数m个不相交子段的最大和)
题目描述
给你一个长度为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个不相交子段的最大和)相关推荐
- HDU 1024 Max Sum Plus Plus
本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题. 读完题就能看出要用DP,但是因为m的范围没有限定,= =加上自己太菜不知道怎么写, 总之先膜拜大佬http://www.cnblo ...
- Max Sum Plus Plus HDU - 1024(动态规划求最大M子段和)
题意: ----最大M子段和问题 给定由 n个整数(可能为负整数)组成的序列以及一个正整数 m,要求确定序列的 m个不相交子段,使这m个子段的总和达到最大,求出最大和. 题目: Now I think ...
- 动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]
Max Sum Plus Plus HDU - 1024 题意大致是说给你你个序列,把它划分成不相交的几个连续的部分,然后把这个几个部分求和,求出和的最大值. 我们定义子结构 dp[i][j] 表 ...
- HDU 1024 Max Sum Plus Plus 动态规划
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目大意:n个数分成两两不相交的m段,求使这m段和的最大值. 解题思路:比较坑的点:n2 能过: ...
- 杭电60题--part 1 HDU1003 Max Sum(DP 动态规划)
最近想学DP,锻炼思维,记录一下自己踩到的坑,来写一波详细的结题报告,持续更新. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem ...
- 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 ...
- HD 1003 Max Sum (最大字段和问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem Description Given a sequence a[1],a[2],a ...
- HDU 1024:Max Sum Plus Plus(DP)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): ...
- 整数行hdu 1244 Max Sum Plus Plus Plus(dp)
废话就不多说了,开始... Max Sum Plus Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
最新文章
- 不同浏览器对URL最大长度的限制
- pb分组数据累计_A轮公司数据分析面试经验
- LeetCode Number of Islands(flood fill)
- ubuntu网络配置
- java中如何将非整数保留到小数点后指定的位数
- C语言实用算法系列之学生管理系统_对整个结构体操作_冒泡排序
- 织梦php重新安装教程,织梦CMS系统后台重装的操作教程
- pickle模块的基本使用
- 技术周刊(2019-02-11 Serverless)
- 60-50-010-API-Kafka producer拦截器(interceptor)
- 这款IDEA插件刷爆了技术群,群友:这用起来真酸爽~
- React中最基础的jsx语法
- C语言pid算法模糊控制,温度PID模糊控制的算法完整
- cosx sinx 泰勒展开 C++
- 花花世界花家姐 舒淇:花花世界花我不会倒追
- php怎么使用sendcloud,请教大牛们 PHPHub 使用 sendcloud 发送邮件需要怎么配置?
- Xiuno BBS 4.0 修改时间显示
- [散分] 眼见为实?_眼见为实
- AVI 文件格式分析
- Java第十章总结集合类
热门文章
- 关于“无人直播”看这一篇就够了
- java 职级评定申报_职级评定方案.doc
- 如何将XLSM文件转换成XLSX格式
- android语音机器人代码,Android studio开发小型对话机器人app(实例代码)
- 《住在隔壁的大学生小夫妻—究竟是谁,弄脏了我们的世界?》--我们的心灵需要净化...
- 所付出的努力终不会被辜负~江南大学计算机初试考研经验分享
- linux yum国内下载源
- ubuntu查看服务器系统型号,Ubuntu Linux系统下查看服务器工作记录分享
- java中人民币的符号怎么打_Java学习笔记---字符串操作(人民币大写转换的实现)...
- 原生servlet使用fileupload获取不到数据