动态规划可分为两种:
一是没有约束条件的动态规划,比如剪绳子,跳台阶。
二是有约束条件的动态规划,比如背包问题。
1.剪绳子
从小往大递推:
f(1)=1
f(2)=f(1)*f(1) =1
f(3)=f(2)*f(1)
f(4)=f(3)*f(1) 或者是 f(2)*f(2)
写两层for循环,第一层for循环是对数字n进行遍历,第二层for循环是对f(n)的计算进行遍历,比较是f(j)*f(h)大,还是直接j*h大(切分两段)
类似的题目可以是:
写出到自然数n为止,加和等于n的数字集合。
比如n=2,返回结果为[1,1],
n=3,返回结果为[1,2],[1,1,1]
2.背包问题
https://zhuanlan.zhihu.com/p/107139719
https://zhuanlan.zhihu.com/p/93857890
https://www.bilibili.com/video/av33930433?from=search&seid=10637513335818789097
0-1背包问题的数学描述。
https://www.cnblogs.com/chiweiming/p/8621374.html
注意初始化不能用第一种,第一种是错的。赋值的时候不是想象中那样,应该是地址问题。
语法糖不能随便乱用https://blog.csdn.net/five3/article/details/83474633
3.买卖股票的最大时机
1.二层遍历,超时
2.一层遍历,用一个变量来记录前面出现过的最小值。