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整理出并填好,计算某一位置