【算法基础】区间动态规划 例题与解析

本文介绍了区间动态规划(区间DP)的基本概念,包括状态、转移和初始化,并通过石子合并问题进行实例解析,展示如何运用区间DP解决求最值问题。通过前缀和优化处理环形数据,实现复杂度降低。
摘要由CSDN通过智能技术生成

hello小伙伴们,疯狂鸽鸽的卷卷毛又来了,今天来分享的,区间动态规划,简称区间dp ( d y n a m i c   p r o g r a m m i n g ) (dynamic\ programming) (dynamic programming),是动态规划的一种。就是动态规划其中一种模型:区间dp

提到动态规划,它是我们在算法题目中常见到的老朋友了,也往往是思维难度相对较大题目的解决核心,潘子就告诉过我们:“动态规划水很深,你把我不住”
在这里插入图片描述
引起这个问题的原因有很多,一个常见的情况就是:动态规划算法题目往往会引起贪心算法的直觉。而一旦将思路限制在贪心算法的验证和细节实现上,就会耗费大量时间精力验证错误答案,背包问题就是经典的例子。

那其实除了今天分享的dp,在之前的文章中,卷卷毛还分享过其他dp问题:

如果要简单来理解动态规划算法的共性或套路,不妨暂且抛开学术上抽象晦涩的符号表达,来围绕着三个核心的概念展开理解:

状 态 , 转 移 , 初 始 化 状态,转移,初始化
在开始将这些概念应用到实际题目中之前,不妨先来一点点粗糙的理论阐述。

首先要确保一点就是,使用动态规划算法思想的题目是可以被分解为相似或同构的子结构的,在这个基础上,

状态往往被定义为一个最优的子结构,对于区间dp,状态经常是:一个区间内XX的最大/小值

转移是指使用已经求解出来的最优子结构来构造更大的最优子结构,对于区间dp,转移经常是:一个区间XX的最值是由区间中的若干种子区间合并组合中的最优值

初始化指在转移开始前将边缘情况的状态赋以初值,对于区间dp,初始化经常是:长度为1区间的初值

好了,粗糙的理论阐述完了,也许和教科书上的有出入,也许会和其他地方的定义由出入,所以仅供参考,但是不妨暂且作为解决问题的思路。

那么,先来看一道经典例题。
(后续的例题在肝了嘤嘤嘤~进度0%


石子合并

P1880 [NOI1995] 石子合并
在这里插入图片描述
这道题可以说是区间dp中最为经典的入门题目之一了。题目大意就是若干堆石子排成环形序列,每次选择合并两堆石子,合并代价是两堆石子的数量和。

问,合并完所有的石子堆后,最大代价和最小代价是多少?

定状态

对于这道题目来说,要求我们求出两种最值,其实是同一个问题。因此不妨以最大值为例:

可以定义状态:mx[i][j]表示合并区间[i,j]内的石子所需要的最大代价

另外,定义:sum[i][j]表示区间[i,j]和

找转移

对于上面定义的状态,可以定义转移方案:

m x [ i ] [ j ] = m a x ( m x [ i ] [ k ] + m x [ k + 1 ] [ j ] ) + s u m [ i ] [ j ] ( k = i , i + 1 , . . . , j − 1 ) mx[i][j]=max(mx[i][k] + mx[k + 1][j]) + sum[i][j]\\\\(k = i,i + 1,...,j - 1) mx[i][j]=max(mx[i][k]+

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值