首页 > 其他分享 >区间DP详细解析

区间DP详细解析

时间:2023-08-10 23:37:25浏览次数:40  
标签:sum 合并 枚举 DP 区间 解析 dp

1.定义与性质

区间类动态规划是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系。

令状态 \(dp_{(i,j)}\) 表示将下标位置 \(i\) 到 \(j\) 的所有元素合并能获得的价值的最大值,那么 \(dp_{(i,j)}=max\{dp_{(i,k)}+dp_{(k+1,j)}+w\}\),\(w\) 为将这两组元素合并起来的代价。

区间 \(dp\) 有如下特点:

  • 1.合并:即将两个或多个部分进行整合,当然也可以反过来;

  • 2.特征:能将问题分解为能两两合并的形式;

  • 3.求解:对整个问题设最优值,枚举合并点,将问题分解为左右两个部分,最后合并两个部分的最优值得到原问题的最优值。

2.模板题

在一条链上有 \(n\) 个数 \(a_1,a_2,\dots,a_n\) 进行 \(n-1\) 次合并操作,每次操作将相邻的两堆合并成一堆,能获得新的一堆中的石子数量的和的得分。你需要最大化你的得分。

思路

令 \(dp_{(i,j)}\) 表示将区间 \([i,j]\) 内的所有石子合并到一起的最大得分。

写出状态转移方程:

\[dp_{(i,j)}=\max\{dp_{(i,k)}+dp_{(k+1,j)}+\sum_{t=i}^{j} a_t \}~(i\le k<j) \]

然后我们用前缀和 \(sum\) 数组消掉求和公式,得:

\[dp_{(i,j)}=\max\{dp_{(i,k)}+dp_{(k+1,j)}+sum_j-sum_{i-1} \}~(i\le k<j) \]

由于计算 \(dp_{(i,j)}\) 的值时需要知道所有 \(dp_{(i,k)}\) 和 \(dp_{(k+1,j)}\) 的值,而这两个中包含的元素的数量都小于 \(dp_{(i,k)}\),所以我们以 \(len=j-i+1\) 作为 \(DP\) 的阶段。

首先从小到大枚举 \(len\),然后枚举 \(i\) 的值,根据 \(len\) 和 \(i\) 用公式计算出 \(j\) 的值,然后枚举 \(k\),时间复杂度为 \(O(n^3)\)

代码十分简单,这里不再摆出。

3.区间DP拓展知识之一—:如何处理带环的区间DP?

针对此问,一般有两种做法:

  • 1.既然是带环的区间 \(DP\),说明一定有 \(n\) 条连边,而题中又只能连 \(n-1\) 次,说明有一条边是用不上的,于是我们可以跑 \(n\) 遍区间 \(dp\),枚举当每条边不被使用时的最优值。(时间复杂度 \(O(n^4)\))

  • 2.可以将这条链延长一倍,即将这条链复制下来接在其后面,最终结果为 \(dp_{(1,n)},dp_{(2,n+1)},dp_{(3,n+2)}...dp_{(n-1,2n-2)}\) 中的最优值,时间复杂度 \(O(n^3)\)。

标签:sum,合并,枚举,DP,区间,解析,dp
From: https://www.cnblogs.com/linbaicheng/p/17621874.html

相关文章

  • 并查集处理区间跳跃
    在网上胡乱找的一些关于并查集处理区间跳跃(也有叫区间覆盖/序列联通性,这类问题有没有什么统一叫法存疑?)的题目,或许能学习后成为一种套路参考:区间跳跃问题KnightTournament板子题维护一个并查集\(nxt\),\(nxt[i]\)为从\(i\)开始(包含\(i\))的第一个没有被打败的骑士的编号并查集......
  • 区间 dp
    模板区间dp一个长\(n(n\le248)\)的序列,选择数列中两个相邻且相等的元素,删去其中一个元素并使另一个元素的值\(+1\),求数次操作后数列中的最大值将这看做是合并的过程\(dp_{i,j}\)表示区间\([i,j]\)和为一个答案的取值,这里的取值其实是唯一的,所以可以之间判断对于每......
  • 记录一个,百度云直链解析的方法和地址
    百度网盘直链提取聚合API是一款免费百度网盘不限速下载工具,和以往发的百度网盘不限速工具差不多,使用方法也简单,工具把真实的文件链接解析出来,然后借助第三方工具IDM、Aria2或者Motrix等等工具进行下载,速度直接拉满,而且工具目前还是免费的,请务必低调用。 网站截图:使用教程:第......
  • 取石子游戏(博弈dp)
    在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的:有 n 堆石子,将这 n 堆石子摆成一排。游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中取出若干颗石子,可以将那一堆全部取掉,但不能不取,不能操作的人就输了。Orez......
  • Unity的AssetPostprocessor之Model:深入解析与实用案例 1
    UnityAssetPostprocessor模型相关函数详解在Unity中,AssetPostprocessor是一个非常有用的工具,它可以在导入资源时自动执行一些操作。在本文中,我们将重点介绍AssetPostprocessor中与模型相关的函数,并提供多个使用例子。OnPostprocessModelOnPostprocessModel是AssetPostprocesso......
  • 在线代码工具:根据十六进制字符串解析对应的字段值
    说明hexString是字节序是小端的(读值得时候会转为大端来读取值)valueByteSizes是个根据要求顺序读取值得字节大小的数组。例如:newbyte[]{4,2,1},程序会顺序读取hexString字符串:第一个值取4个字节并读取其值,第2个值取2个字节,第3个值取1个字节,4.(如果存在)第4个值取1个字节。......
  • 软件测试|深入解析Docker Run命令:创建和启动容器的完全指南
    简介Docker是一种流行的容器化平台,用于构建、分发和运行应用程序。其中一个最基本且重要的Docker命令是dockerrun,用于创建和启动容器。本文将详细解析dockerrun命令的用途、参数和示例,帮助您全面掌握创建和启动容器的过程。dockerrun在Docker中,容器是运行应用程序的独立环境。do......
  • HTMLParser(一个比较流行的html代码解析、处理开源项目)学习,总结
    主页:http://htmlparser.sourceforge.net/ HtmlParser初步研究bylostfire这两天准备做一些网站编程的工作,于是对HtmlParse小研究了一下,目的是快速入手,而不是深入研究,做了一下整理,和大家共同讨论一下。一,数据组织分析:HtmlParser主要靠Node、AbstractNode和Tag来表达Html,因为Remar......
  • Spring Cloud Alibaba全解析:构建可靠的分布式系统
    标题:SpringCloudAlibaba全解析:构建可靠的分布式系统引言:随着互联网技术的不断发展,分布式系统的概念和应用越来越广泛。作为构建可靠和弹性的分布式系统的关键技术之一,SpringCloudAlibaba提供了一套完整的解决方案,帮助开发者更轻松地构建和管理分布式系统。本文将全面解析Spri......
  • reactnative ignite App + wordpress後台CMS 詳細案例
    1.0入門篇WordPress-Plugin-Boilerplate-Tutorial更为简洁的架构方案ReactNativeElements开发环境&生成项目&虚拟机调试&本地生成APK档&虚拟机运行APK档 2.0Ignite框架 Ignite是reactnative里最最齊全的軍火庫。https://github.com/infinitered/ignite 3......