贪心和从暴力递归到动态规划

1.切黄金问题

哈夫曼编码的经典问题

当堆里面只剩一个元素时,停

小根堆:所有数,总是拿出两个最小的,拼,记录,放回堆,循环进行

通过定义比较器,可以实现不同的堆

计算从底向上,切割顺序从上到下

力争每两次切的时候差不多!

2.项目花费利润问题

启动资金W,一次只能做一个项目

最多能做项目K

小于W的都弹出小根堆(花费),大根堆(利润)接收弹出的所有,弹出大根堆堆顶,做它

初始资金增加,此时再判断新的初始资金,是否能解锁新的项目,若能解锁新的,弹入大根堆

 

生成项目的数组以及重新定义比较器

自然智慧,哈哈哈哈

本题的几种贪心策略:

1.早,不可以

2.持续时间短,安排,不可以

3.判断早结束的项目,并且进行淘汰,此种可行

没有道理,对数器验

累积!!!贪心策略

暴力递归到动态规划:

图灵:我不知道怎么算,但我知道怎么试

P和NP,多项式时间(我知道它怎么算)NP问题:我不知道它怎么算,但我知道它怎么试

理解不了动态规划,动态规划就是为了优化暴力尝试的

暴力递归:尝试的感觉

题目1:求N!

题目2:汉诺塔问题

不可以小压大,移动次数最少

杆永远是3个

n是指汉诺塔在最左侧有n层

问题抽象:

不分左右

from

to

help

一共2^n-1步

把问题变为规模缩小了的同类子问题

有明确的不需要进行递归的条件(base case)

有得到了子问题的结果之后的决策过程

不记录任何一个子问题的解

子序列问题:

baseCase

写初始项,尝试

不是贪心,是枚举,暴力枚举

f(1,1)求了两次,大量的重复计算,暴力递归不行的原因

这种题目怎么改动态规划?

什么样的尝试版本的递归可以改成动态规划?

1.有重复运算

2.该重复运算与到该状态的路径无关(无后效性问题:前期动作对后面无影响)

所有返回值可以装在二位表中

baseCase

写出尝试版本,分析可变参数,点出最终状态,依据basecase设置好初始状态,逆向返回

动态规划:空间换时间

搭积木

 

f(m,n):m为当前位置,n为前向和

i处初始和sum,i及其之后的位置自由选择,能否加出aim

 

i sum

与题意无关

只与代码有关

什么样的尝试版本的递归可以改成动态规划?

1.有重复运算

2.该重复运算与到该状态的路径无关(无后效性问题:前期动作对后面无影响)

最后返回(0,0)位置的true or false

看baseCase

越界也OK?!?!?!

arr.length/背包问题 

写尝试,做优化  

负数也列出来,总之将参数的变化范围列出来

动态规划的空间优化

i和sum为可变参数

关键点:尝试版本,列出可变参数的变化范围、basecase整理出并填好,计算某一位置

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值