AT_joisc2019_h ランプ (Lamps)

### 为何写这篇题解。

洛谷月赛重题。

### 问题分解。

我们将这个问题分解为以下几个小问题:

- 理解并优化操作顺序。

- 确定反转操作的优化策略。

- 确定推平操作的优化策略。

- 设计动态规划算法来求解最小操作次数。

------------

### 解决问题。

##### 问题1:如何优化操作顺序?

- 如果两个操作的区间有交集,我们可以先推平再反转,这样可以减少操作次数。

- 如果两个操作的区间没有交集,我们可以任意调整它们的顺序,不会影响最终结果。

##### 问题2:如何优化反转操作?

- 对于同一个位置,最多只需要进行一次反转操作。因为两次反转操作相当于没有操作。

##### 问题3:如何优化推平操作?

- 如果一个区间已经被推平,那么在这个区间上再进行推平操作是没有意义的。

##### 问题4:如何设计动态规划算法?

我们设计一个三维动态规划数组 $dp_{i,j,k}$ ,其中 $i$ 表示考虑前 $i$ 个位置,$j$ 表示当前状态,$j = 0$ 表示不在推平区间内,$j = 1$ 表示在推平区间内且推平的值为 $0$,$j = 2$ 表示在推平区间内且推平的值为 $1$。       

 $k$ 表示是否在反转区间内,$k = 0$ 表示不在,$k = 1$ 表示在。
 
状态转移方程如下:

- 不进行任何操作:$dp_{i,j,k} = dp_{i-1,j,k}$

- 进行推平操作:如果 $A_i$ 与 $B_i$ 相等,则可以选择推平操作,将 $A_i$ 设为 $B_i$。

- 进行反转操作:如果 $A_i$ 与 $B_i$ 不相等,则必须进行反转操作。      

------------

### 解题答案。

最终答案为 $dp_{n,0,0}$,其中 $n$ 为数组的长度。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值