剪绳子
offer12给出的是一个数学类的问题,现有一段长度为n>1的绳子,要将其剪成m>1段,m,n均为整数,问如何剪才能使得剪断的每一段绳子的长度乘积最大。
比方说,有一段长度为5的绳子,那么有如下的剪法:
[4,1],[3,1,1],[3,2],[2,2,1],[2,1,1,1],[1,1,1,1,1]
其中[3,2]有最大的乘积6.
动态规划
关于动态规划,展开讲的话就没完没了了。我给出了两个知乎上的链接和一个cnblog上的介绍,我觉得这三个地儿讲得足够齐全了。
当然,我们举一个非常简单的例子来说明动态规划的核心:我比较认可的是第一个链接中的一个说法,动态规划就像魔改的数列题,核心是在于写出状态转移方程,也就是将下一个状态写成和上一个状态有关的例子。我们正是拿这个数列说事——斐波那契数列。
我们知道斐波那契数列可以写成通项
F n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 F_{n}=\frac{\left(\frac{1+\sqrt{5}}{2}\right)^{n}-\left(\frac{1-\sqrt{5}}{2}\right)^{n}}{\sqrt{5}} Fn=5(21+5)n−(21−5)