什么是分治策略
分治策略是一种典型解决问题的策略,将问题分为若干更小规模的部分,通过解决每一个小规模部分问题,并将结果汇总得到原问题的解。
什么是优化问题
计算机科学中许多算法都是为了找到某些问题的最优解。
什么是贪心策略
在对问题求解时,总是做出在当前看来是最好的选择。
递归算法改进
关键在于消除重复计算,用一个表将计算过的中间结果保存起来,在计算之前查表看看是否已经计算过。
这个算法的中间结果就是部分找零的最优解,在递归调用过程中已经得到的最优解被记录下来。
中间结果记录可以很好解决找零兑换问题,实际上这种方法还不能称为动态规划,而是叫做记忆化/函数值缓存的技术提高了递归解法的性能。
课程练习(自己写的共14.00/19.00分,之后再填坑系列)
1单选(2分)下列哪个算法使用到了分治策略?
A.博物馆大盗问题
B.单词最短编辑距离
C.二分查找
D.迷宫寻路
2单选(2分)函数值缓存最适合使用哪种Python中的数据类型?
A.栈
B.列表
C.字典
D.集合
3单选(2分)已知数列G(x)满足:
G(1)=G(2)=G(3)=G(4)=1
G(x)=G(x-1)+G(x-2)+G(x-3)+G(x-4) (x≥5)
根据递推式写出求数列值的递归算法,问原始算法与采用函数值缓存的算法时间复杂度分别为多少?
A.O(5 ^ n); O(1)
B.O(n ^ 4); O(n^2)
C.O(5 ^ n); O(n^2)
D.O(4 ^ n); O(n)
4单选(2分)博物馆大盗问题中,若共有8件宝物,背包总重为25单位,使用动态规划算法求解时需要建立多大的数组?
A.10x26
B.9x26
C.10x27
D.8x26
5单选(2分)以下哪个说法是错误的?
A.“单词最短编辑距离”问题不应该使用贪心法解决
B.相比于函数值缓存,动态规划的优势在于不需要额外的存储空间
C.“字符串匹配”问题中可以应用动态规划思想
D.贪心法适用于局部最优等同于总体最优的问题求解
6多选(3分)以下是使用递归算法对N皇后问题求解的不完整代码:
def solveNQueen(N):
pool = # <A>
def queen(cur=0):
if cur == len(pool):
return # <X>
res = # <Y>
for col in range(len(pool)):
pool[cur], flag = col, True
for row in range(cur):
if pool[row] == col or abs(col - pool[row]) == cur - row:
flag = False
break
if flag:
res += queen(cur+1)
return res
return queen(0)
# test
print(solveNQueen(8))
阅读代码,选出正确的选项
A.A处可以填“[]*N”
*B.A处可以填“[None]N”
C.若X处填"1",Y处填"0",该函数可返回N皇后问题解的个数
D.该算法时间复杂度为O(N^2)
7多选(3分)以下哪些问题可用动态规划算法解决?
A.列表排序
B.单词最短编辑距离
C.后缀表达式求值
D.斐波那契数列求值
8多选(3分)以下哪些说法是错误的?
A.动态规划可以减少算法的空间复杂度
B.函数值缓存可以减少算法的时间复杂度
C.动态规划不能减少算法的时间复杂度
D.函数值缓存不能减少算法的时间复杂度