hdu 1024 Max Sum Plus Plus

2023-11-03

Problem

acm.hdu.edu.cn/showproblem.php?pid=1024

题意

给一个长为 n 的序列,有从中挑 m 个相互不重合的子序列求总和,让总和最大。

分析

(没能看懂百度的前几份题解…好像都跟 kuangbin 的写法差不多:www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html

下面是同学教的思路:

dp[ i ][ j ][ 0/1 ]:从前 i 个数中挑 j 个子序列的最大和,第 3 维分别用 0 和 1 表示第 i 个数是否包括在第 j 个子序列内(最后一个数只能在最后一个序列内)

转移方程:dp[ i ][ j ][ 0 ] = max { dp[ i-1 ][ j ][ 0 ] , dp[ i-1 ][ j ][ 1 ] }

dp[ i ][ j ][ 1 ] = max { dp[ i-1 ][ j ][ 1 ] + s[ i ] , dp[ i-1 ][ j-1 ][ 1 ] + s[ i ] , dp[ i-1 ][ j-1 ][ 0 ] + s[ i ] }(s[ i ]附在最后一个序列尾,或自成一个新序列)

因为不知道 m 多大,所以第一维用滚动数组

Source code

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1000000;
const long long INF = 1234567891011LL;

int s[N+1];
long long dp[2][N+1][2] = {0};

int main()
{
	int m, n;
	while(~scanf("%d%d", &m, &n))
	{
		for(int i=1; i<=n; ++i)
			scanf("%d", s+i);
		for(int i=0; i<2; ++i)
			for(int j=1; j<=m; ++j)
				dp[i][j][0] = dp[i][j][1] = -INF;
		for(int i=1; i<=n; ++i)
			for(int j=1; j<=m; ++j)
			{
				dp[i&1][j][0] = max(dp[i&1^1][j][0], dp[i&1^1][j][1]);
				dp[i&1][j][1] = s[i] + max(dp[i&1^1][j][1],
					max(dp[i&1^1][j-1][0], dp[i&1^1][j-1][1]));
			}
		printf("%I64d\n", max(dp[n&1][m][0], dp[n&1][m][1]));
	}
	return 0;
}
这份代码有点神奇,之前初始化的第 2 层循环是从 1 到 N,一直 MLE;换成从 1 到 m 后就没有爆内存了。dp 数组应该是定义之后就分配了固定大小了吧?不知道为什么有影响。

另外,从转移方程可以看出,第 1 维应该可以省去,只要里层循环改成倒序就行了。于是改写一发。

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1000000;
const long long BIG = 1234567891011LL;

int s[N+1];
long long han[N+1] = {0}; // 原dp[][][1]
long long bu[N+1] = {0}; // 原dp[][][0]

int main()
{
	int m, n;
	while(~scanf("%d%d", &m, &n))
	{
		for(int i=1; i<=n; ++i)
			scanf("%d", s+i);
		for(int j=1; j<=m; ++j)
			han[j] = bu[j] = -BIG;
		for(int i=1; i<=n; ++i)
			for(int j=m; j; --j)
			{
				bu[j] = max(bu[j], han[j]);
				han[j] = s[i] + max(han[j],
					max(han[j-1], bu[j-1]));
			}
		printf("%I64d\n", max(han[m], bu[m]));
	}
	return 0;
}
最后附上 Maple 的还没看懂的代码


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hdu 1024 Max Sum Plus Plus 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 如何从不同的线程访问控件?

    如何从创建控件的线程以外的线程访问控件 避免跨线程错误 这是我的示例代码 private void Form1 Load object sender EventArgs e Thread t new Thread foo t Start p
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 意外的 const 引用行为

    include
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d

随机推荐

  • 【React+TS】从零开始搭建react+typescript+router+redux+less+px2rem自适应+axios反向代理+别名@+Antd-mobile

    一 通过create react app脚手架创建项目 npx create react app testproject template typescript 在vscode中打开项目 可以看到顺利生成了react项目且组件的后缀为tsx
  • Java web项目创建笔记23 之《spring整合xxl-job》

    xxl job是一款功能强大的分布式任务调度系统 部署方法按照官网写的说明即可 https www xuxueli com xxl job 1 下载release版本代码 https github com xuxueli xxl job r
  • 先电Openstack云平台搭建【超级详细】【附带镜像】

    前言 大二上学期学习Openstack 苦于百度与CSDN上没有对应版本的教程 学的十分艰难 在此 将我的Openstack云平台搭建过程写出 留给新手学习 准备工作 VMware Workstation Pro 虚拟机 我使用版本 15
  • C++模板,模板具体化,特例化

    1 模板重载原则 函数同名 重载 时 调用优先级通常为 普通函数 gt 显式具体化 template specilazation gt 显式实例化 gt 一般模版函数 但更一般而言 有两条规则 1 gt 如果各自函数形参和调用处的实参 并非
  • Java锁的基本用法

    文章目录 Java锁的基本用法 synchronized和lock synchronized 首先在没有加锁的情况下 加锁的情况 Lock 首先在没有加锁的情况下 加锁的情况下 线程的通信 synchronized 通过wait和notif
  • Js 代替eval的方法 字符串转对象

    js中常用eval 函数将一个字符串当作一个JavaScript表达式一样去执行 但在安全漏洞上是存在隐患的 现找到eval函数的替代方法 let a custId 9860131056 custName custAdd const res
  • Apache Flink 使用DataStream API进行数据处理

    问题导读1 流处理和批处理分别入口是什么 2 对于本地和远程运行程序 都可以使用哪个函数 3 Flink数据源分为哪两类 4 Flink DataStream和DataSet source都是基于什么格式 5 Flink中kafka sou
  • 货币兑换(指针与常量)

    货币兑换 指针与常量 题目描述 设定以下汇率常量 美元汇率为6 2619 表示1美元兑换6 2619元人民币 欧元汇率为6 6744 表示1欧元兑换6 6744元人民币 日元汇率为0 0516 表示1元日元兑换0 0516元人民币 港币汇率
  • matlab 矩阵列乘系数,matlab 给某一列乘上一个系数

    矩阵M是一个 mxn 的矩阵 现在要给M矩阵的第一列都要乘上10 使其第一列扩大10倍 那肿么做呢 我第一时间用的是 M 1 M 1 10 错误的 但是这个错了 结果是不对的 这里要用点乘才行 所以正确的写法是 M 1 M 1 10 正确写
  • Qt 实现简易串口助手

    界面预览 代码如下 h文件 pragma once include
  • 重磅更新!YoloV4最新论文!解读yolov4框架

    论文地址和代码 https arxiv org abs 2004 10934v1 代码 https github com AlexeyAB darknet 本篇博文是对YOLOv4论文的翻译和框架解读 并且有PDF版本可供下载 YOLOv4
  • 如何删除EFI分区

    当我们想重装一下Ubuntu时 需要删除之前的系统以腾出空间 这时会发现之前Ubuntu系统的EFI分区用磁盘管理删除不掉 这里有两个解决方法 1 使用大白菜或者类似的U盘启动工具进入PE系统 使用自带的磁盘管理工具来进行删除 2 直接在W
  • 如何设置计算机自动连接宽带,宽带连接怎么设置,怎么设置宽带自动连接

    处于信息时代的我们 电脑 智能机早已不再是陌生的产品 宽带的连接是我们通过电脑与外部沟通 发布信息的重要渠道 如果没有宽带的连接 那么就算有电脑与无法实现上网的功能 通常会有人疑惑的是 宽带要怎么样才能够自动连接 实现上网的方便程度呢 如果
  • 帝国CMS手机APP服务器端接口API

    帝国CMS手机APP服务器端接口API 100个左右接口详细请看 https www guiboweb com appapi html 使用说明 使用示例 demo 安全验证 security 新闻模型 新闻列表与搜索 list 新闻内容
  • Nginx Windows下编译和安装

    参照官网http nginx org en docs howto build on win32 html提前下载好编译所需软件 Microsoft Visual C compiler Microsoft Visual Studio 8 an
  • 华为OD机试 -最长回文子串(C++ & Java & JS & Python)

    描述 给定一个仅包含小写字母的字符串 求它的最长回文子串的长度 所谓回文串 指左右对称的字符串 所谓子串 指一个字符串删掉其部分前缀和后缀 也可以不删 的字符串 数据范围 字符串长度1 350 1 s 350 进阶 时间复杂度 O n 空间
  • c++ windows下基于TCP的socket编程 入门

    服务器端 socket 创建1个socket bind 绑定IP地址 端口号等信息到socket上 listen 监听 设置允许最大连接数 accept 接受客户端的请求连接 send 和 recv read 和 write 收发数据 cl
  • 定时拷贝删除文件命令

    拷贝文件夹 会把这个文件夹下的文件拷贝到oss的img文件夹下要加 不然会重命名为img的文件 而不拷贝iiimg文件夹本身 ossutil64 cp home leite iiimg oss elatemall img rf ossuti
  • 660 40

    题干 初次思路 1 ln 1 x 1 y gt ln 1 x ln 1 y 对数除法的变形 2 考察了高次求导与泰勒公式理解 泰勒公式可以展开成常数以及从1阶到n阶的无穷小 题目告知是零点 函数值为零的点 的n阶导数 故展开为麦克劳林公式
  • hdu 1024 Max Sum Plus Plus

    Problem acm hdu edu cn showproblem php pid 1024 题意 给一个长为 n 的序列 有从中挑 m 个相互不重合的子序列求总和 让总和最大 分析 没能看懂百度的前几份题解 好像都跟 kuangbin