动态规划 Round Two!

2、区间模型
对于每个问题,都是由子区间推导过来的,我们称之为区间模型,下面是一个例子。
“我们有一个连续的序列,每个序列上面都是一个数字c[i],每次我们都能够消灭一个连续的回文子序列,消灭之后左右会合并,成为一个新序列,问最少需要多少次才能够把整个序列消灭掉。回文就是从左到有从右到左读到的序列都是一样的。
题目比较抽象,我们通过一些例子来说明这个问题吧?例如一开始的序列是1 4 4 2 3 2 1,那么我们最少需要2次,先消灭掉4 4 , 然后再消灭调1 2 3 2 1.
第二个例子是 1 2 3 4 5 5 3 1,我们先消灭掉2 然后再消灭掉4, 最后消灭 1 3 5 5 3 1, 需要3次。“

以下内容转自经典算法

对区间模型示例的思考:
这个题目,受过一定算法训练的人,想必是能够看出这是一道关于动态规划的题,即使可能找不到状态转移方程~

其实,这是一种常见的动态规划的套路,区间动态规划。区间动态规划,最常用的就是用f[i][j]表示一个区间,他可以由他的子区间推导出来。找出最优解的推导公式,一些都水到渠成。这个题目亦是如此。

我们用f[i][j]表示消灭第i个数到第j个数总最少需要多少次。

1、如果i=j,也就是单元素的时候,那么需要一次。

2、如果我们最左边的单独消灭,那么就是1+f[i+1][j],例如下面的子序列1 2 3 3 2,f[1][5]=f[1][1]+f[2][4]。
(可能大家会有疑问,为什么只讨论左边单独消灭而不讨论右边。假设最右边的单独消灭能得到更优解,那么它便会存在于第三种情况,请往下看~)

3、第三种情况,我们可以找到跟c[i]一样的元素,然后把这个序列一分为二,结果为f[i][j]=f[i+1][k-1]+f[k+1][j],这个可能比较抽象,这里面一个问题,我们先举个形象的例子,例如 1 2 3 3 2 1 7 7 9 9, 那么我们可以找到跟第一个元素相同的,也就是第6个元素, f[1][10] = f[2][5] + f[7][10], 这里有人可能会提问,那么这两个1为什么不用消除了呢?因为它可以跟着f[2][5]的最后一次消除消掉!

4、对于第三种情况,一个最特殊的例子是最前面的两位相同,这个时候f[i+1][k-1]不存在!所以f[i][j]=1+f[i+2][j],对应的例子是4 4 2 1 3。

综上所述,状态转移方程为在这里插入图片描述
下面是用go实现的代码。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值