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
即三重迴圈
Leetcode 664 奇怪的印表機
有台奇怪的印表機有以下兩個特殊要求 印表機每次只能列印同乙個字串行。每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。示例 1 輸入 aaabbb 輸出 2 解釋 首先列印 aaa 然後列印 bbb 示...
奇怪的印表機 LeetCode664
有台奇怪的印表機有以下兩個特殊要求 印表機每次只能列印同乙個字串行。每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。示例 1 輸入 aaabbb 輸出 2 解釋 首先列印 aaa 然後列印 bbb 示...
動態規劃 leetcode 664 奇怪的印表機
有台奇怪的印表機有以下兩個特殊要求 印表機每次只能列印同乙個字串行。每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。示例 1 輸入 aaabbb 輸出 2 解釋 首先列印 aaa 然後列印 bbb 示...