自十五号集训结束回到家中,醉生梦死了三天三夜,然后继续开始我的学习生活......
过去的一周里,主要完成的是,观看mooc学习视频动态规划,以及leetcode上相应的若干个题目。基本上都是被虐的一点想法也没有,所以没有办法,我只能通过多看一些题目的解析,以及反复的观看视频,慢慢的才有一点感觉,我觉得学习的困难主要还是在于自己的学习积极主动性不够高,以及自主学习能力不足的问题。
动态规划它的主要思想就是:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。通俗来说就是:大事化小,小事化无。它大致的意思应该就是比如给你一个榴莲,你直接啃肯定啃不了,但是你把它剥开,分成一份份小份的就很容易了。
接下来我直接分享一道据说十分经典的题目求斐波拉契数列Fibonacci;题目是:指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)要你求第n项的数是多少?
我选择的方法是自下而上的检索法,主要是利用for循环层层检索,我选择这种方法是因为用刚学的递归来做,感觉自己都有点接受不了。
先看看主要的代码:
def fibonacci(n):
"""
:param n: int-->指代给定的参数大小
:return: int-->指代第n项对应的值
"""
if n == 1:
return 1
memo = [0]*(n+1)
memo[1] = 1
for index in range(1, n):
memo[index+1] = memo[index] + memo[index-1]
return memo[n]
if __name__ == "__main__":
n = 6
final_array = fibonacci(n)
print(final_array)
前面那个就是代表斐波那契数列。。这里有用到的是一个列表memo,标记列表memo的值为n+1,memo【index】的值就是记录第index项的值。
动态规划中包含三个重要的概念,最优子结构、边界、状态转移公式。我只能怪算是搞明白了前面两个,就拿上一题来说,比如:fib(6)=fib(5)+fib(4),其中fib(5)和fib(4)就是fib(6)的最优子结构;fib(1)=fib(2)=1给定的初始值就是边界。但是最重要的,也是核心还是状态转移公式,但是我还没搞懂.........
害,继续努力吧·······
(计算机201 叶某)
博主分享了自己学习动态规划的心得,以斐波那契数列为实例,介绍了动态规划的基本思想和自下而上的解题方法,并提供了Python代码实现。动态规划的关键概念包括最优子结构、边界和状态转移公式,博主表示对状态转移公式的理解还需深入。
697

被折叠的 条评论
为什么被折叠?



