给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续)

例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段。

dp[i][j]从前j个数字中选择i段,然后根据第j个数字是否独立成一段,可以写出

状态转移方程:dp[i][j]=max(dp[i][j-1]+num[j],max(dp[i-1][k])+num[j])

这里的max(dp[i-1][k])代表的拥有i-1段时的最大值,然后再加上num[j]独立成的一段。

但是题目中没有给出m的取值范围,有可能爆内存和爆时,都需要处理一下。

对于防爆内存:注意到dp[i][*]只和dp[i][*],dp[i-1][*],即当前状态只和前一状态有关,可以用滚动数组优化(资料)。

对于防爆时:既然max(dp[i-1][k])代表的拥有i-1段时的最大值,我们可以用一个数组pre储存之前的最大值

状态转移方程:dp[i][j]=max(dp[i][j-1]+num[j],pre[j-1]+num[j])发现不关i什么事,于是乎

最后的状态转移方程:dp[j]=max(dp[j-1]+num[j],pre[j-1]+num[j])

#include <iostream>
#include <algorithm>
using namespace std; const int N=;
const int INF=0x3f3f3f3f;
int num[N],pre[N],dp[N]; int main(){
int n,m;
while(scanf("%d %d",&m,&n)!=EOF){
for(int i=;i<=n;i++) scanf("%d",&num[i]),dp[i]=,pre[i]=; int MAX;
dp[]=pre[]=;
for(int i=;i<=m;i++){
MAX=-INF;
for(int j=i;j<=n;j++){//这里以i开始,因为最少要i个数字才能支撑i段
dp[j]=max(dp[j-]+num[j],pre[j-]+num[j]);
pre[j-]=MAX;
MAX=max(MAX,dp[j]);
}
} printf("%d\n",MAX);
}
return ;
}

HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化的更多相关文章

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

  2. HDU 1024 Max Sum Plus Plus ——(M段区间的最大和)

    感觉有点奇怪的是这题明明是n^2的复杂度,n=1e6竟然能过= =.应该是数据水了. dp[i][j]表示前j个数,分成i段,且最后一段的最后一个为a[j]的答案.那么转移式是:dp[i][j] = ...

  3. HDU 1024 Max Sum Plus Plus --- dp+滚动数组

    HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...

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

  5. hdu 1024 Max Sum Plus Plus DP

    Max Sum Plus Plus Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php ...

  6. HDU 1024 max sum plus

    A - Max Sum Plus Plus Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  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,最大m子段和】

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

  9. hdu 1024 Max Sum Plus Plus

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

随机推荐

  1. 浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象

    ylbtech-浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象 1.返回顶部 1. Boolean 对象 Boolean 对象表示两个值:"tr ...

  2. 基于form表单的极验滑动验证小案例

    01.目录展示 02.url.py urlpatterns = [ path('admin/', admin.site.urls), path('login/',views.login), path( ...

  3. Kettle使用教程之数据同步

    数据模型原型如下: 1.表输入,针对最新的数据输入的表 2.目标表,需要更新的表 3.两个表都需要进行排序操作 4.合并,根据id进行合并 5.数据同步(包括更新.插入.删除) 6.点击运行,就可以实 ...

  4. Docker环境安装部署Java应用(含安装Tomcat和JDK)

    1.部署思路 两台docker机(centos 7系统),Docker 版本:18.09.6, build 481bc77156 Docker host IP:192.168.102.135 Dock ...

  5. 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_05.入门程序之入门代码编写

    先把默认的index.jsp删掉.默认的index.jsp没有jsp的声明 ok webapp文件夹下new一个 起名叫做index.新建的页面有jsp的头 创建控制器类 java下新建一个class ...

  6. Python学习笔记:(十二)输入输出

    一.格式化输出 1.str.format()函数,格式化输出值 2.将输出值转变为字符串,可以使用repr()和str() str()函数将返回一个易读的表达式形式: repr()返回一个解释器易读的 ...

  7. java:JQuery(声明,JQ和JS对象的区别,prop,attr,addClass,offset,trigger,dblclick和change事件,hide,show,toggle,slideUp,slideDown,slideToggle,三种选择器,标签的获取,三张图片的放大与缩小)

    1.JQuery: jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计 的宗旨是“ ...

  8. Centos7 修改系统时间和硬件时间不一致的问题

    查看系统时间 [root@localhost ~]# dateSat Feb 24 14:41:22 CST 2018 查看硬件时间 [root@localhost ~]# hwclock --sho ...

  9. 根据输入的整数n使得输出精确到小数n位

    #include<iostream> #include<stdio.h> using namespace std; int main(){ int a,b,c; while(t ...

  10. chrome插件--安装以及问题记录

    vue-devtools 插件网址下载 问题1 Vue.js is detected on this page. Devtools inspection is not available becaus ...