动态规划算法的应用模型

线性模型

【例题】在一个夜黑风高的晚上,有n(n <= 50)个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不大于两人通过,他们只有一个手电筒,所以每次过桥的两个人需要把手电筒带回来,i号小朋友过桥的时间为T[i],两个人过桥的总时间为二者中时间长者。问所有小朋友过桥的总时间最短是多少。

思路1:贪心算法。总是跑得最快的人跑回来的话,那么他在每次别人过桥的时候一定得跟过去。但是,来看一组数据 四个人过桥花费的时间分别为 1 2 5 10,按照贪心算法答案是19,但是实际答案应该是17。

具体步骤是这样的:

第一步:1和2过去,花费时间2,然后1回来(花费时间1);

第二歩:3和4过去,花费时间10,然后2回来(花费时间2);

第三部:1和2过去,花费时间2,总耗时17。

所以贪心想法是不对的。

思路2:动态规划。

我们先将所有人按花费时间递增进行排序,假设前i个人过河花费的最少时间为opt[i]。

首先看初始状态:opt[0]=0,opt[1]=T[1], opt[2]=T[2]...

再看最后状态:最后只可能有两种情况

情况1:岸这边只剩一个人。最后渡河会是1和i一起渡河。

  状态转移方程:opt[i] = opt[i-1]+T[1]+T[i]

  其中opt[i-1]是i-1个人在对岸最少时间,所以此时手电筒必定在对岸;T[1]是送手电筒回来的时间;T[i]是最后渡河时间。

情况2:岸这边只剩两个人。最后渡河会是1和2一起渡河。

  状态转移方程:opt[i] = opt[i-2]+T[1]+T[i]+T[2]+T[2]

  其中opt[i-2]是i-2个人在对岸最少时间,所以此时手电筒必定在对岸;T[1]是送手电筒回来的时间;T[i]是最后渡河时间(i为目前为止最后一个,所以必定比另一个人慢),第一个T[2]是送手电筒回来的时间;第二个T[2]是2和1一起渡河的时间。

这两种最后情况其实对应的是:每个人可以选择与1一起渡河,也可以选择除1和2之外的一个人渡河。

那么总的状态转移方程取这两者的最小值

opt[i] = min{opt[i-1] + a[1] + a[i] , opt[i-2] + a[1] + a[i] + 2*a[2] }

 

区间模型

区间模型的状态表示一般为d[i][j],表示区间[i, j]上的最优解,然后通过状态转移计算出[i+1, j]或者[i, j+1]上的最优解,逐步扩大区间的范围,最终求得[1, len]的最优解。

【例题】给定一个长度为n(n <= 1000)的字符串A,求插入最少多少个字符使得它变成一个回文串。


相关:http://lib.csdn.net/article/datastructure/9063

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值