动态规划进阶一
动态规划dp(Dynamic Programming)
基本思想:是通过类似分治的方法,将一个人问题分解成多个阶段求解,每一个决策都依赖于当前的状态,决策过后问题又发生转移,通过多步转移方式求解的过程就叫做动态规划。
适用于动态规划的问题应具有的性质:
(1)最优化原理:如果问题的最优解包括子问题的最优解,那么问题的子问题解也是最优解,类似与贪心算法,从局部最优到整体最优;
(2)无后效性:某一个状态一旦确定,将不受该状态以后的状态影响,只与当前状态有关,既无后效性;
(3)有重叠子问题:子问题間不獨立,一個子問題在一個階段會多次調用;
求問題的基本步驟:
動態規劃處理的都是多個狀態的問題,那麼先從一個問題入手
現在有3中硬幣面值為1,3,5,現在要用這三種硬幣湊成11,問所需的硬幣最少為多少?
對於這個問題我們先從最簡單的分析:當i=0即我們需要多少枚硬幣湊夠0元,當然在所有的硬幣中沒有比1更小的,所以為0個,我們用符號記錄下來方便分析,即f(0)=0,那麼當i=1時,因為滿足的只有1元的硬幣,所以我們拿起一枚面值為一的硬幣,然後加上能組成0元的方法,然而這個我們已經知道了,所以f(1)=f(1-1)+1=1,同理那麼當i=2時,f(2)=f(2-1)+1=2,但是當i=3時候就不是這個狀態了,這時候我們要考慮面值為3的硬幣了,所以就分為兩種情況,f(3)=f(3-1)+1=f(2)+1=3,第二種方式f(3)=f(3-3)+1=f(0)+1=1 ,當i=3的兩種選擇解釋為,當我拿起一枚1元的硬幣那麼我需要在加上湊成兩元的硬幣那麼就是當前的方式,第二組我直接拿起面值為3的硬幣 那么只需要湊成0元的就是當前的方式,題目要求選取最小的組成,所以f(3)=1,所以得到的狀態轉移方程為f(i)=min(f(i-vi)+1),所謂的狀態轉移就是將一個大問題轉化為多個子問題解決,求子問題的最優解得到問題的最優解;
偽代碼:
for( i=1–S)
for( j=0–n-1)
if( v<i and f(i)=min( f(i-v)+1,f(i) ) )
其實這就是一維背包的算法。