动态规划算法的应用模型

线性模型

【例题】在一个夜黑风高的晚上,有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,求插入最少多少个字符使得它变成一个回文串。

原文地址:https://www.cnblogs.com/qionglouyuyu/p/5126573.html