首先介绍动态规划的概念:
①问题是由交叠的自问题构成的,是对给定问题求解的递推关系中的相同类型的*更小子问题的解*dp+回溯
②从顶至下,避免计算不需要计算的小解(记忆)
③求解最优化问题可以用动态规划
动态规划下笔写代码前先去顶递推式
直接看实例:
一、币值最大化问题
给定一排n个硬币,其面值均为正整数c1,c2,c3……cn,这些整数并不一定两两不同,请问如何选择硬币,使得在其原始位置互不相邻的条件下,所选金额最大。
上述最大金额可用fn来表示,为了得到fn的递推关系,将所有可行的选择分为两组,包括最后一枚硬币和不包括最后一枚硬币的。
F(N)={① 包括最后一枚硬币 cn+f(n-2)
②不包括最后一枚硬币 f(n-1)
其递推式:
**则 fn=max{cn+f(n-2),f(n-1)}
f(0)=0,f(1)=c1**
coinrow(c[1..n])
//应用上述递推式,自底向上求最大金额
//在满足所选硬币不相邻的条件下,从一排硬币中选择最大金额的硬币
//输入:数组c保存n个硬币的面值,下标从1开始