求递推式方法:
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背包顺序遍历
滑动窗口
保证窗口中元素均满足条件,若不满足,排除左边,直到满足
Note1: 集合统计(哈希表) + 滑动窗口
思路: 左右区间作窗口,右边出现重复,left
到上一个重复字符的下一个位置(index + 1)即可保证窗口中无重复字符
Note2: 集合统计(数值) + 滑动窗口
思路: (1)窗口内统计字符频率,向右减少频率,向左增加频率;
(2)当某个字符频率低于0,左侧向右压缩(增加频率),直到对应字符频率不低于0
(3)当某个时刻窗口字符频率与目标字符频率相同,添加窗口Left索引