欢迎光临散文网 会员登陆 & 注册

AcWing1089. 烽火传递(单调队列优化DP)

2023-02-26 22:49 作者:ZzzzH777  | 我要投稿


https://www.acwing.com/problem/content/description/1091/

一.说人话:

给定长度为 n 的数组 w , w[i] 表示第 i 个元素的权值.

每个元素只有选和不选两种情况

找到一种元素的选择方案,满足如下条件

条件1:相邻被选择的元素间相差至多相隔 m−1 个 不选的元素

条件2:所有被选择的元素权值和最小

二.分析:

典型的最优解问题,考虑使用dp求解

尝试把答案拆分成一个个子集

状态表示: dp[i] 表示 在前 i 个元素范围中  满足条件1且选择第 i 个元素 的所有当前方案 中的最小权值和

状态划分: 已知 最后一个选择的元素是第 i 个,根据倒数第二个被选择的元素的位置( 倒数第二个元素从第 i-m 到第 i-1 个 ), 可以不重不漏的划分为多个子集.

状态转移方程:      dp[i] = min( dp[i-m], dp[i-m+1] ... dp[i-2], dp[i-1] ) + w[i]    ( i-m > = 1 )

最终满足题意的答案为

三.使用单调队列进行优化:

在这个一维状态计算和转移的过程中,求解 min( dp[i-m], dp[i-m+1] ... dp[i-2], dp[i-1] )正好属于移动固定长度区间最小值问题.

因此可以使用 单调队列 进行优化

需要注意的是,从小到大处理状态dp[i]时

dp[i]对应的新的区间的左端点为 i-m ,右端点 为 i-1

也就是说新滑入元素为 dp[i-1] , 新滑出元素为dp[i-m-1]

四.关于最终解的问题:

一般的dp问题的最终解为 dp[n]

然而,在本题中 dp[n] 表示从1->n 满足条件1且选择第 n 个元素 的所有当前方案 中的最小权值和

但是最优方案的第n个元素并不一定需要选择,最后一个选择的元素可能为 第 n-m+1 到 第n个.

所以最优方案应当是 dp[n-m+1]...dp[n-1],dp[n] 的最小值

当然,还有一种码量更简单的解决办法,假设存在第n+1个元素,但权值为0

dp[n+1]表示在前 i+1 个元素范围中  满足条件1且选择第 i+1 个元素 的所有当前方案 中的最小权值和

满足前i+1个元素满足题意,必然前i个满足题意,又因为第i+1个权值为0,不影响最终解的答案

因此最终答案为dp[n+1]

四.代码



AcWing1089. 烽火传递(单调队列优化DP)的评论 (共 条)

分享到微博请遵守国家法律