算法基础——动态规划(2)网格图DP(基础)

算法基础——动态规划(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 = 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值