leetcode 664奇怪的打印机 区间dp

12 篇文章 0 订阅

leetcode刷题系列

原题链接: 戳这里.

代码

class Solution:
    def strangePrinter(self, s: str) -> int:
           dp={}
           def getdp(i,j):
               if i>j:
                   # 递归的终止条件
                   return 0
               ans=1+getdp(i+1,j)
               # 每次结果最大就是新增的与之前都不同,所以加1
               if (i,j) not in dp:
                   # 不在就需要计算
                   for k in range(i+1,j+1):
                       if s[i]==s[k]:
                           ans = min (ans,getdp(i+1,k)+getdp(k+1,j))
                   dp[i,j]=ans
               return dp[i,j]
           return getdp(0,len(s)-1)

题解

区间dp主要的思想就是要明白,二维的dp解决不了问题了,一定要引入多一次的循环,为什么二维dp解决不了了呢?
对于此问题,dp数组的值表示i到j 的最小解,那么此解只有两个答案,
要么是i+1到j的解+1,及新增的字母不在i+1到j中
要么是i+1到j的解
那么到底是哪个i+1到j 的字母打印了第i个字母是不确定的
所以应该多来一个循环,
k从i到j
即三重循环

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值