代码:
python
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
ans = []
for i in range(numRows):
hang = [1] * (i+1)
for j in range(1, i):
hang[j] = ans[i-1][j-1]+ans[i-1][j]
ans.append(hang)
return ans
代码:有点怕看不出来是 dp 的题 。。。
python
class Solution:
def rob(self, nums: List[int]) -> int:
n = len(nums)
if n == 1:
return nums[0]
dp = (n+1) * [0]
dp[0] = 0
dp[1] = nums[0]
dp[2] = max(nums[0], nums[1])
for i in range(3, n+1):
dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])
return dp[n]
解析:
容易忘的点
if n == 1 边界不能丢 :数组只有 1 个元素时,不能执行dp[2] = max(nums[0], nums[1]),访问nums[1]直接下标越界报错。
状态转移
不偷第 i 间房子 :最大收益就等于前i‑1间房子的最优结果dp[i‑1]。
偷第 i 间房子 :那上一间不能偷,取前i‑2间最优加上当前房子钱:dp[i‑2]+nums[i‑1]。 取两者较大值就是 dp[i]。
公式:
dp[i] = max(dp[i‑1], dp[i‑2] + nums[i‑1])
小提示:dp 下标代表前几间房子 ,nums 是原始数组,所以要错开一位用nums[i‑1]。
代码:
python
class Solution:
def numSquares(self, n: int) -> int:
dp = [float('inf')] * (n+1)
dp[0] = 0
for i in range(1, n+1):
j = 1
while j*j <= i:
dp[i] = min(dp[i], dp[i-j*j]+1)
j += 1
return dp[n]
解析:
定义 :dp[i] 表示凑出整数 i 需要的最少完全平方数个数
初始化 :dp[0] = 0,其余位置初始为无穷大
计算顺序 :从小到大依次计算 dp[1] 到 dp[n]
状态转移 :对每个 i,遍历所有不超过 i 的平方数 j²,dp[i] = min(dp[i], dp[i-j²] + 1)
最终答案 :dp[n]
注意:因为凑完全平方数可无限选 '1'(最小完全平方数),因此,不存在无法凑出的情况。