動態規劃9:變態跳臺問題

LingLee_荊棘鳥發表於2017-07-19

題目:

一隻青蛙一次可以跳上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特殊考慮。

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

[java] view plain copy
 print?
  1. publicclass Solution {  
  2.     public int JumpFloorII(int target) {  
  3.        //特殊輸入:對於target為0的情況OJ並不關心  
  4.         if(target<0return 0;  
  5.         if(target==1return 1;  
  6.        return 2<<(target-2);  
  7.     }  
  8. }  

相關文章