首先从斐波那契数列来看动态规划,递推公式为:f(n+2)=f(n+1)+f(n)。
若普通求解f(n),则需要一直往下递推,直到f(1)和f(2)为止,但用动态规划,使用dp数组储存每个阶段的f(n),则每次f的求解都不需要循环往下计算,只需调用dp数组中n-1与n-2阶段的f值即可。
这样大大节约运行时间,动态规划也就是做这么件事。
动态规划的使用场景:各阶段的最优解有一定的相关型,某一阶段的最优解可以根据前一阶段的最优解再计算的来。
dp数组是最优解数组,任意数据是当前情况下的最优解(动态规划的核心)
如何确定dp数组(如何计算出dp数组)是解题的关键。(找出规律)
动态规划的题型我大概将其分为两类:
一:求最优解问题。(背包问题)
二:求解的个数问题。(整数的k拆分问题)
最优解问题:
最优解问题最有代表性的是背包问题。
问题描述:
有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。
设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。
问题解析:
对于可行的背包装载方案,背包中物品的总重量不能超过背包的容量