时间:2025-03-07 21:51
人气:
作者:admin
n-sum:一般都用双指针traverse(root) 改为 traverse(root->left,root->right)preorder[prestart]在中序的位置获取leftsizepreorder[prestart+1]在后序的位置获取leftsizedeque实现单调队列visited和onpath记录遍历状态核心思想是穷举,目标是找出正确的状态转移方程
三要素:重叠子问题、最优子结构、状态转移方程
四步走:① 确定base case ② 确定状态,也就是原问题和子问题中会变化的变量 ③ 确定选择,也就是导致状态变化的行为 ④ 明确dp函数/数组的定义
框架
# 自顶向下递归的动态规划
def dp(state1, state2, ...):
for choose in all_choose:
result = max(result, dp(state1, state2, ...))
return result
# 自底向上迭代的动态规划
dp[0][0][...] = base case
for state1 in all_state1:
for state2 in all_state2:
for ...
dp[state1][state2][...] = max(state1,state2...)
最长递增子序列:dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度
信封俄罗斯套娃问题:先按宽度升序排列,如果宽度一样,则按高度降序排列;然后再在高度序列上找最长递增子序列
小数偏差:比如 x 和 y 是两个六位小数,那么不能直接 x>y 而是 x-y>1e-8(一般往后多两位)
离散化:这个知识点还是需要重新做,比较绕
位运算:&(与)、^(异或)、|(或)、~(取反)
①x&-x 得到的是 x 二进制第一个非0的最小位所代表的数的大小,这个叫做 lowbit 操作
②获取 n 的二进制第k位:n>>k&1
最大公约数:int gcd(int a, int b){return b ? gcd(b, a % b) : a;}
求组合数:\(C^i_j=C^{i-1}_{j}+C^{i-1}_{j-1}\)
int转string:to_string,string转int:stoi
贪心:定义比较规则