1. 程式人生 > >動態規劃10:變態跳臺階

動態規劃10:變態跳臺階

題目:一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

思路:分析可知:如果要上n階臺階,擁有的可能方法數目是:

f(n)=f(n-1)+f(n-2)+f(n-3)+……f(1)+f(0);

於是從前往後計算出各個項的值就可以,在簡單臺階問題中需要保留2個計算結果供後面的計算使用,這裡需要保留每一項的計算結果,可以使用一個數組來儲存dp[i],但是進一步分析發現可知:

f(n)=f(n-1)+f(n-2)+f(n-3)+……f(1)+f(0);

f(n-1)=f(n-2)+f(n-3)+……f(1)+f(0);

即f(n)=2*f(n-1);

於是只要保留1項結果就可以了,再分析初始值,

f(0)=1;

f(1)=1;

f(2)=2;……

於是f(n)=2^(n-1);

常識:一個整數除以2可以使用向右位移1位來實現,即2>>1=1;一個整數乘以2可以使用向左位移1位來實現,4<<1=8,於是本題中f(n)=2<<(n-2),注意左移動-1並不等價於右移1,於是對n=0,n=1特殊考慮。

注意:答案不要溢位,雖然不用處理但是在面試時要考慮溢位的問題並說明。

publicclass Solution {
    public int JumpFloorII(int target) {
       //特殊輸入:對於target為0的情況OJ並不關心
        if(target<0) return 0;
        if(target==1) return 1;
       return 2<<(target-2);
    }
}