LC 279.完全平方数
思路跟LC 322 零钱兑换那道题如出一辙,将n理解为背包容量,完全平方数理解为物品即可。
python
class Solution:
def numSquares(self, n: int) -> int:
dp = [float('inf')] * (n + 1)
dp[0] = 0
i = 1
while i*i <= n:
for j in range(i*i , n + 1):
dp[j] = min(dp[j - i*i] + 1 , dp[j])
i += 1
return dp[n]
JAVA版本
java
class Solution {
public int numSquares(int n) {
int[] dp = new int [n+1];
for(int i = 1 ; i < dp.length ; i ++ ){
dp[i] = Integer.MAX_VALUE;
}
for(int i = 1 ; i*i <= n ; i++){
for(int j = i*i ; j <= n ; j ++){
dp[j] = Math.min(dp[j - i*i] + 1 , dp[j]);
}
}
return dp[n];
}
}
和LC 322 的一个小区别在于,本题不需要判断"if dp[j - i*i] == Integr.max",因为本题是一定能凑成的,1可以凑成所有数字。
LC 139.单词拆分
python
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
dp = [False] * (len(s) + 1 )
dp[0] = True
for i in range(len(s) + 1):
for j in range(i):
word = s[j : i]
if dp[j] == True and word in wordDict:
dp[i] = True
break
return dp[len(s)]
是真难想,换一个题,dp数组的含义和递推公式就不会了。。。。
本题中,dp[ i ]的含义是,长度为 i 的字符串,是否能被字典里的单词构成 。
递推公式: 假设 s = "applepen" ,dp[s.length]就代表s能否被字典里的单词构成,它的结果依赖于子字符串(比如apple),apple得能被字典里的单词构成,并且,子字符串到当前字符串之间的字符串,也是出现在字典中,