区间DP

区间DP

例1. 关路灯

原题连接

大意:给你初始位置$x_0$以及每个路灯的位置$x_i$和功率$p_i$,你的速度为1$m/s$,问关闭所有路灯后,最小的能耗

解:

规定$sum_k=\sum_{i=1}^{k}p_i$

设$dp[i][j][0/1]$表示关闭$[i,j]$的所有路灯后,你停留在i位置(0)或者j位置(1)的最小能耗

那么对于$dp[i][j][0/1]$有两种转移策略:

​ 第一种策略:$dp[i][j]从dp[i + 1][j]$转移过来; 第二种策略:$dp[i][j]从dp[i][j+1]$转移过来

所以对于$dp[i][j][0]$,他只会从$dp[i+1][j][0],dp[i+1][j][1]$转移过来:

​ 如果他从$dp[i+1][j][0]$转移过来,有:$dp[i][j][0]=dp[i+1][j][0]+(x_{i+1}-x_i)*(sum_{n}+sum_i-sum_j)$

​ 如果他从$dp[i+1][j][1]$转移过来:有:$dp[i][j][0]=dp[i+1][j][1]+(x_j-x_i)*(sum_{n}+sum_i-sum_j)$

解释一下$sum_{n}+sum_i-sum_j$,因为我最后要站在i位置上,所以位置$[i+1,j]$的灯都是关上的,他们的功率和是$sum_j-sum_{i}$

所以剩下的在工作的功率就是$sum_n-sum_j+sum_i$

同理对于$dp[i][j][1]$,他只会从$dp[i][j-1][0],dp[i][j-1][1]$转移过来:

​ 如果他从$dp[i][j-1][0]$转移过来,有:$dp[i][j][1]=dp[i][j-1][0]+(x_j-x_i)*(sum_n-sum_{j-1}+sum_{i-1})$

​ 如果他从$dp[i][j-1][1]$转移过来,有:$dp[i][j][1]=dp[i][j-1][1]+(x_j-x_{j-1})*(sum_n-sum_{j-1}+sum_{i-1})$

解释一下$sum_n-sum_{j-1}+sum_{i-1}$,因为我最后要站在j位置上,所以位置$[i,j-1]$的灯都是关上的,他们的功率和是$sum_{j-1}-sum_{i-1}$,所以剩下的在工作的灯的总功率是$sum_n-sum_{j-1}+sum_{i-1}$


关于赋初值的问题,我们只需要吧初始位置$x_0$的dp设置为0即可,即$dp[x_0][x_0][0] = dp[x_0][x_0][1]=0$

其余的位置我可以不去管他,因为他是从i出发的

例2. 涂色

原题连接

大意:给你一个长度为n的木板,涂成给定的颜色状态,其中对于相同的位置,先刷上的颜色会被后刷上的颜色覆盖,问最小的涂色次数

解:

我们设$dp[i][j]$表示把位置$[i,j]$涂成目标状态的最小涂色次数

那么,对于任意的i,有$dp[i][i]=1$,一个点,最小的次数一定是1


对于$i\ne j \land s[i]==s[j]$,那么$dp[i][j]=min(dp[i][j-1],dp[i+1][j])$

为什么?对于$dp[i][j-1]$,我在涂色$[i,j-1]$时,是可以把$s[i]$也考虑进来的($s[i]==s[j]$),也就是说我可以先把$[i,j]$全部涂色成$s[i]$的颜色,之后再在$[i,j-1]$上找最优秀的涂色方式。

问题:把整个区间涂色之后不会导致我的$dp[i][j-1]$不成立吗?不会。因为先涂色的会被覆盖,刷的范围越大,只会对结果更有利


对于$i \ne j \land s[i]\ne s[j]$,那么$dp[i][j] = \max_{k=i}^{j}{dp[i][k]+dp[k+1][j]}$,就是两个区间的和

问题1:两个区间不会出现两者中间有连续一段相同的颜色,可以一步到位吗?会出现,但是我的k会枚举到他们分别在两个区域中的情况

问题2:会不会出现先把$[i,j]$都刷成某一种颜色,再进行涂色,使得方案更优?会出现,但是因为这里$s[i]\ne s[j]$所以当我的$k=i||k=j-1$时,实际上我的$dp[i][k]+dp[k+1][j]$就是问题2中描述的情况($dp[i][i] = dp[j][j]=1$)


区间DP
http://example.com/2024/06/26/区间DP/
作者
John Doe
发布于
2024年6月26日
许可协议