第十四周总结

这周主要学习了dp动态规划的知识,发现难点还是在于状态转移方程,真的想不出。。。
或者说有的题目大体思路有了,状态方程懂了,但是具体到代码实现上又很难下手,动态规划也就是为了减轻运算的复杂程度所运用的,它可以让一个复杂度为n的次方数运算降低。也就避免了在求一个很大的数时出现的无法运行的情况。将子问题的各种情况都进行枚举,从中找到最优解。子问题的最优解组成原问题的最优解。和贪心一样,它相较于之前学的贪心一样,没有固定的模板,掌握了思想和基本题型思考方法就能够理解应用。

其中给我印象最深刻的还是经典的子序列(和子矩阵)问题,这个系列的方法很是巧妙。在这个系列中每次的状态都要取决于上一次的状态,也就是说我们要想得到最终结果必须试着从上次的状态中摸索出其规律所在。但是如果老师没有讲或者从来没有看过代码实现的话,可能我真的想不出这样的思路

对于动态规划,目前我只掌握了递推和递归来处理问题以下就是根据博客中的例题的总结

【例题1】在一个3 X N的长方形方格中,铺满1X2的骨牌(骨牌个数不限制),给定N,求方案数(图一 -1-1为N=2的所有方案),所以N=2时方案数为3。

思路:通过递归模拟方案变换,然后设计条件筛选选出最优方案即可。

【例题2】有N种物品(每种物品1件)和一个容量为V的背包。放入第 i 种物品耗费的空间是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。

思路:简单的背包问题,关键点在于第i个物品在前i-1个物品放置完毕后,是选择放还是不放。

【例题3】70. 爬楼梯

思路:将问题分解为一些包含最优子结构的子问题,它的最优解可以从其子问题的最优解来构建,使用动态规划来解决。

int c(int n){
    if(n==1)return 1;
    int d[n+1];
    d[1]=1;
    d[2]=2;
    for(int i=3;i<n+1;i++){
        d[i]=d[i-1]+d[i-2];
    }
    return d[n];
}

动态规划的本质就是递推和记忆化搜索。
递推的思想在动态规划中体现是状态转移方程,就是两个相邻结点的最优情况之间的推导关系。由状态转移方程可以从一个端点推到另外一个端点,再从所有的结点中找出最优解。记忆化搜索就是递推过程中解决了贪心目光短浅的问题,记忆化搜索可以记录下当前结点以前的所有结点的最优解
,贪心是对面前的选择做出一个选择,选择出当前最诱人的路,这种算法的缺点在于目光短浅,而动态规划则是有点逆推的味道,从终点出发,路过每一个结点都可以求出当前结点到终点的最优解,以后的结点又可以利用这个结点的最优解继续求出最优解,到达终点就求出了答案。也就是说相较于贪心,动态规划在求解过程中会更加清晰。同时也避免了重复计算。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值