求递推式方法:
Note1: 直接递推
f(n,o)表示的是以N为长度,以O为结尾的合法字符串个数
Note2: 分类讨论,递推
f(n,1,3)表示以N为长度,以第一种颜色开头,3为结尾的合法字符串数量
问题 Y: LELE的RPG难题(分类讨论,三维)-CSDN博客
简单关系:
Note: f(n)=f(n-2)+f(n-1)递归
Note: f(n)=f(n-2)+f(n-1)迭代(规模较大)
普通DP:
Note: dp[i][j]=max(dp[i+1][j],dp[i+1][j+1]); (注意边界条件)
背包问题:
01背包:
Note: 一维数组优化,一循环w[i]
放在物品的一侧,二循环w[i]放在物品另一侧(不放w[i]已优化)
def count_different_weights(n, weights):
# 初始化动态规划数组,大小为总重量+1,初始值都为0
# dp[i]表示是否可以称出重量i(1表示可以,0表示不可以)
dp[0] = 1 # 设置重量0总是可以称出
for weight in weights:
# 如果可以称出重量 j - w[i],则也可以称出重量 j
for j in range(sum_weights, weight - 1, -1):
dp[j] |= dp[j - weight]
# 如果可以称出重量 j,则也可以称出重量 j + w[i]
for j in range(sum_weights - weight, -1, -1):
dp[j + weight] |= dp[j]
# 计算可以称出的不同重量的总数(减去重量为0的情况)
answer = sum(dp) - 1
return answer
完全背包:
Note: 01背包顺序遍历