1. 程式人生 > >算法-動態規劃

算法-動態規劃

浪費 方式 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的博客

算法-動態規劃