奇怪的印表機 LeetCode664

2021-10-06 02:25:28 字數 1381 閱讀 4317

有台奇怪的印表機有以下兩個特殊要求:

印表機每次只能列印同乙個字串行。

每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。

給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。

示例 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 不在...