算法-動態規劃
阿新 • • 發佈:2019-04-07
浪費 方式 tail nac n-1 fib n-2 public 一個
在牛客網做題時遇到個很簡單的題,即求斐波那契(Fibonacci)數列的第n項。我一看,這太簡單了, 不就是一個遞歸解決的事嗎。然後。。。就沒有然後了。事實證明,這道題用遞歸算法太浪費資源了,效率也不高。於是 看了下大神代碼,說是用動態規劃解決,效率之高令我汗顏,因此在網上了解了下動態規劃思想。然而我發現這是個挺 復雜的東西,或許是我沒弄明白吧,總之今天先記錄所得,雖不完整亦為收獲。
動態規劃
動態算法的核心是記住已經求過的解。而記住已經求過的解有兩種方式:自頂向下的備忘錄 和自底向上。
自頂向下的備忘錄方式也要用到遞歸,這裏暫且不表。重點來談談自底向上的方法。
簡單來說,自底向上就是先把必定要算出來的子算法先求出來,再通過子算法層層往上。對於Fibonacci數列來說, 求其第n項,那麽第n-1項都是必須要求的,而求其第n-1項,第n-2項也是必求的。。。。最底層的就是第0項了.代碼如下
public static int fib(int n)
{
if(n<=0)
return n;
int []Memo=new int[n+1];
Memo[0]=0;
Memo[1]=1;
for(int i=2;i<=n;i++)
{
Memo[i]=Memo[i-1]+Memo[i-2];
}
return Memo[n];
}
優化後代碼如下
class Solution { public int Fibonacci(int n) { int p = 0; int f = 1; while(n-- != 0){ p += f; f = p - f; } return p; } }
詳細內容見HankingHu的博客
算法-動態規劃