算法-动态规划

在牛客网做题时遇到个很简单的题,即求斐波那契(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的博客

posted @ 2019-04-07 16:51  北冥虾  阅读(103)  评论(0编辑  收藏  举报