From 6c0b5429654a7717ee18877167c8b5d070b0faa2 Mon Sep 17 00:00:00 2001 From: CurryWOE <76390659+CurryWOE@users.noreply.github.com> Date: Mon, 30 Oct 2023 18:01:15 +0800 Subject: [PATCH] =?UTF-8?q?Update=20dp=E4=BC=98=E5=8C=96.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增常见DP优化 --- "docs/Dp/dp\344\274\230\345\214\226.md" | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git "a/docs/Dp/dp\344\274\230\345\214\226.md" "b/docs/Dp/dp\344\274\230\345\214\226.md" index 14680c941..feb676d8c 100644 --- "a/docs/Dp/dp\344\274\230\345\214\226.md" +++ "b/docs/Dp/dp\344\274\230\345\214\226.md" @@ -28,6 +28,8 @@ for(int len=2;len<=n;++len) --- DP优化: +记忆化搜索 + 合并同类项 如果转移式子只和上一层有关,滚动数组 @@ -36,10 +38,12 @@ DP优化: 整除只在余数为0时变换,可以用同余聚类 -增量式DP:以XX为结尾的串/序列,后面加一个XX - 遍历一棵树,设当前遍历到 $u$ 节点,有子节点 $v_1,v_2,...$,每次遍历一颗子树就把信息和前几颗子树的信息合并,放到 $u$ 上,最终总的复杂度是 $O(n^2)$。因为每对不同点对 $(x,y)$ 不会重复合并,最多 $O(n^2)$ 个不同点对 一颗树的高度小于等于树大小,所以合并复杂度如果和高度相关,不会超过 $O(n^2)$ 如果DP取值是1或0,不妨把一维作为信息去处理,而不是条件 + +对于dp[i][j]从max(dp[i-1][j-1],dp[i-2][j-2],dp[i-3][j-3]...)转移过来的,这样对角线上的DP,每条对角线用i-j作为标识符,求DP时同时处理每条对角线前缀最大值 + +连续m个元素至少选2个,考虑最后两个元素选择在什么位置,可以把倒数第二个元素绝对位置,空间复杂度O(n),优化成倒数第二个元素和倒数第一个元素的相对位置,空间复杂度O(m)。同时倒数第一个元素的位置考虑对m取模,这样第一维也优化成O(m)