有台奇怪的印表機有以下兩個特殊要求:
印表機每次只能列印同乙個字串行。
每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。
給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。
示例 1:
輸入: "aaabbb"
輸出: 2
解釋: 首先列印 "aaa" 然後列印 "bbb"。
示例 2:
輸入: "aba"
輸出: 2
解釋: 首先列印 "aaa" 然後在第二個位置列印 "b" 覆蓋掉原來的字元 'a'。
動態規劃。對於乙個區間s[i,j]
可以分成兩部分s[i,k]
和s[k+1,j]
,分析這兩個小區間如何列印,就可以得到s[i,j]
的列印次數。
dp陣列的含義:dp[i][j]
的含義是s[i]
到s[j]
的列印次數。
初始條件:
狀態轉移:
s[i,j]
分成兩部分s[i,k]
和s[k+1,j]
,此時dp[i,j] = dp[i,k]+dp[k+1,j]
。
但是如果s[k]=s[j]
,就需要在dp[i,j]
的基礎上減一。舉例:abc需要列印三次,對於c和abc依舊只要列印三次,第一次只需要列印cccc即可。官方解法中的條件是s[i] == s[k]
,其實是一樣的,目的是要把之間分隔點的字元和最外面的字元(s[i]或者s[j])進行比較,看是否相等。
參考題解:chillin jam的題解
class
solution
int n = s.
length()
;int
dp =
newint
[n][n]
;//初始條件
for(
int i =
0; i < n; i++)}
for(
int i =
0; i < n; i++
)//狀態轉移
for(
int len =
1; len < n; len++
) dp[i]
[j]= math.
min(dp[i]
[j], total);}
}}return dp[0]
[n-1];
}}
Leetcode 664 奇怪的印表機
有台奇怪的印表機有以下兩個特殊要求 印表機每次只能列印同乙個字串行。每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。示例 1 輸入 aaabbb 輸出 2 解釋 首先列印 aaa 然後列印 bbb 示...
LeetCode 664 奇怪的印表機
動態規劃 先去重,再考慮狀態轉移 對於每個位置字元分別有兩種狀態,獨立列印或一同列印,再考慮到列印次數,一維的 dp i 不夠描述狀態 再加一維,每次連續列印時只考慮某2個字元屬於同乙個列印批次,列出狀態轉移方程 dp st,ed begin 1 dp st 1,ed dp st,i 1 dp i ...
leetcode 664奇怪的印表機 區間dp
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 不在...