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 即三重循环
转载请注明原文地址: https://lol.8miu.com/read-4984.html