当前位置: 首页 > news >正文

HDU-1024 Max Sum Plus Plus(DP)

题意:可以认为是最大和子序列的进化版, 要求从一串序列中取出若干段, 使得这几段的和最大。

思路:

可以先推出来一个二维的转移方程式:

dp[i][j] = max(dp[i-1][j]+num[i], max(dp[t][j-1]+num[i]);  (其中 j-1 <= t <= i-1)

表示从前i个数中取j个段能够取得的最大和,并要求最后一个段包含num[i];

题目给的序列长度为1e6,二维肯定爆,所以再考虑优化空间。

分析上面二维方程式,发现共取j段的dp[i]只会和dp[i-1]和(j-1)段的dp[i]有关。

所以增加一个pre数组存储上一层(j-1)的状态即可。


细节请看代码,

#include <algorithm>
#include <iostream>
#include <string.h>
#include <cstdio>
#define LL long long
using namespace std;
const LL inf = 0x3f3f3f3f3f3f3f3f;
const int maxn = 1000005;
LL dp[maxn], pre[maxn];
int num[maxn];
int n, m;
LL ans, mmax;
int main()
{
	while(~scanf("%d %d", &m, &n))
	{
		for(int i = 1; i <= n; ++i) 
		{
			scanf("%d", &num[i]);
			dp[i] = pre[i] = 0;
		}
		dp[0] = pre[0] = 0;
		for(int j = 1; j <= m; ++j)
		{
			mmax = -inf; //用mmax寻找pre(j-1)~pre(i-1)中的最大值 
			for(int i = j; i <= n; ++i)
			{
				mmax = max(mmax, pre[i-1]);
				dp[i] = max(dp[i-1], mmax) + num[i];
			}
			for(int i = j; i <= n; ++i) pre[i] = dp[i];
		}
		ans = -inf;
		for(int i = m; i <= n; ++i) ans = max(ans, dp[i]);
		printf("%lld\n", ans);
	}
	return 0;
}

继续加油~

相关文章:

  • C#开发微信门户及应用(27)-公众号模板消息管理
  • CodeForces 628D(数位DP)
  • 多重背包--二进制优化
  • JS高级程序设计2nd部分知识要点2
  • HDU-4549(矩阵快速幂+欧拉定理)
  • xcode Aborting commit: '~/Pods' remains in tree-conflict 错误的解决办法
  • 网络流之最大流(FF, EK, Dinic, SAP)
  • QDU-ycb的ACM进阶之路(多重背包做法)
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—B qwb与矩阵
  • F5 LTM 在SIP消息负载均衡中存在的问题
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—D qwb与神奇的序列
  • 我所爱的世界
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—J qwb又偷懒了
  • 字符串处理文章outline
  • 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—K qwb与小数
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 2017届校招提前批面试回顾
  • 345-反转字符串中的元音字母
  • Android开源项目规范总结
  • egg(89)--egg之redis的发布和订阅
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • gcc介绍及安装
  • Git 使用集
  • javascript从右向左截取指定位数字符的3种方法
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP变量
  • 反思总结然后整装待发
  • 力扣(LeetCode)21
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 深入 Nginx 之配置篇
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信小程序填坑清单
  • 我的面试准备过程--容器(更新中)
  • AI算硅基生命吗,为什么?
  • kubernetes资源对象--ingress
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • zabbix3.2监控linux磁盘IO
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • $.ajax()方法详解
  • (6)STL算法之转换
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十)c52学习之旅-定时器实验
  • (十一)c52学习之旅-动态数码管
  • (十一)图像的罗伯特梯度锐化
  • (学习日记)2024.01.19
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Compact Framework 多线程环境下的UI异步刷新