動態規劃 leetcode 664 奇怪的印表機

2021-10-06 02:42:37 字數 1321 閱讀 9786

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

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

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

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

示例 1:

輸入: 「aaabbb」

輸出: 2

解釋: 首先列印 「aaa」 然後列印 「bbb」。

示例 2:

輸入: 「aba」

輸出: 2

解釋: 首先列印 「aaa」 然後在第二個位置列印 「b」 覆蓋掉原來的字元 『a』。

難度:困難,假設dp代表第l個位置到r個位置之間的最小列印次數,對於任何的dp[l][r],都有dp[l][r] = dp[l+1][r] + 1,因為l肯定是第乙個列印的,

對應每乙個長度的i,假設i=1時,l的位置可以是0到n-i,假設l取0,那麼r=0+i-1=0,因此所有的i=1,有l=r,對應位置的dp[l][r]就等於1

假設i=4,l=0時,r=0+4-1=3,dp[0][3]=dp[1][3]+1,k可以取1、2、3,k遍歷是找到最小的次數,要找到按照k劃分還是維持當前dp[l][r]值那個最小

class

solution

:def

strangeprinter

(self, s:

str)

->

int:

ifnot s:

return

0 n =

len(s)

dp =[[

0]*(n+1)

for i in

range

(n+1)]

for i in

range(1

, n+1)

:for l in

range

(n-i+1)

:# 計算的時候保證小的已經算出來了

r = l + i -

1 dp[l]

[r]= dp[l+1]

[r]+

1for k in

range

(l+1

, r+1)

:if s[k]

== s[l]

: dp[l]

[r]=

min(dp[l]

[r], dp[l]

[k-1

]+dp[k+1]

[r])

return dp[0]

[n-1

]

Leetcode 664 奇怪的印表機

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

奇怪的印表機 LeetCode664

有台奇怪的印表機有以下兩個特殊要求 印表機每次只能列印同乙個字串行。每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。示例 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 ...