动态规划问题2

来源:互联网 发布:用户mac地址绑定错误 编辑:程序博客网 时间:2024/05/18 03:56


详细说明请参阅前一篇博文,有算法的详细步骤,本篇博文只给出核心思想与代码:

 

问题一:

给定某个数n,从1开始,每步只能增加1,或2倍增加,求到n的最小步数,比如

10的最小步数是 2 4 5 10 4步。

 

1,拆分问题:求n的最小步数,化成求n-1的最小步数。

2,数据结构dp(n)表示从1n的最小步数。

3,状态转移方程:

n为奇数:dp(n) = dp(n-1)+1,比如dp(99)=dp(98)+1

n为偶数:min[dp(n-1)+1,dp(n/2)+1],求dp(n-1)+1dp(n/2)+1中的最小值。比如dp(100)的值为dp(99)+1dp(50)+1中的最小值

 

当然这个问题最优方法是从后往前算,这样可以避免计算大量无用值,以上思路完全是从动态规划思想去考虑的。


问题二:


array为棋盘矩阵,棋子array[0][0]走到array[i][j]的最短距离,棋子方向只能向下或向右。

1,数据结构:dp(i,j)表示到第i行第j列的最短距离array为棋盘矩阵,棋子array[0][0]走到array[i][j]的最短距离,棋子方向只能向下或向右。

2,状态转移方程:

1)dp(0,j)dp(i,0)的值为array边的相加

2)除去dp(0,j)dp(i,0)的情况,min[dp(i-1,j)dp(i,j-1)] + array(i,j),比如求dp(2,2)dp(2,2)的值只能从dp(1,2)dp(2,1)处求得,因为棋子方向只能向下或向右,因此求dp(1,2)dp(2,1)的最小值,最后再加上array[2][2]。即为dp(2,2)的值。