首页 > 编程语言 > 详细

算法-动态规划

时间:2019-04-07 17:08:49      阅读:112      评论:0      收藏:0      [点我收藏+]

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

算法-动态规划

原文:https://www.cnblogs.com/damocleses/p/10665963.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!