算法基础——动态规划(2)网格图DP(基础)
LCR 166. 珠宝的最高价值
常规dp(或者有递推的回溯,贪心等方法)都可以通过分析递归调用树(搜索树)来分析时间复杂度。其中树的层数代表做选择的次数,本题中任意方法选择次数相等,均为m(行数)+n(列数)次,故有m+n层,空间(递归的栈空间)用到m+n。又每次选择的选项仅有两个,故为二叉树,从而我们能计算递归调用次数2^(m+n)。
dp优化方法一般是:
- 时间:备忘录(记忆化搜索)-> 自底向上(递推)
对本题的优化方法:
- 空间:两个数组(滚动数组)->一个数组 ->原地修改
代码如下
1、递推:
dfs函数改为d数组
递归边界改为数组初始值
递归改成循环
class Solution:
def jewelleryValue(self, frame: List[List[int]]) -> int:
d=[[0 for i in range(len(frame[0]))] for j in range(len(frame))]
d[0][0]=frame[0][0]
for i in range(1,len(frame)):
d[i][0]=d[i-1][0]+frame[i][0]
for j in range(1,len(frame[0])):
d[0][j]=d[0][j-1]+frame[0][j]
for m in range(1,len(frame)):
for n in range(1,len(frame[0])):
d[m][n]=max(d[m-1][n],d[m][n-1])+frame[m][n]
return d[-1][-1]
空间O(nm)
class Solution:
def jewelleryValue(self, grid: List[List[int]]) -> int:
m, n =

最低0.47元/天 解锁文章
1435

被折叠的 条评论
为什么被折叠?



