Ryanlyt / algorithm-learning

The firse
0 stars 0 forks source link

9.15 #7

Open Ryanlyt opened 1 year ago

Ryanlyt commented 1 year ago

动态规划

核心:状态的表示和状态的转移(偏数学,没有模板) Dp:状态表示f(i, j)(集合(所有选法、条件{1、只从前i个物品中选出;2、总体积<= j})、属性(Max,Min,数量)),状态计算 Dp优化:一般都是对动态规划的代码或者计算方程做一个等价变形(先把基本的形式写出再考虑优化)

背包问题

N, V, vi, wi _c941bd398a00faf32800f1405b6f7929_-932091413_Screenshot_2023-09-14-20-32-25-802_com alicloud databox

_db05c5e1f88064eb025441d4d9f07b02_117727857_Screenshot_2023-09-15-01-30-50-844_com alicloud databox _463f81875127f61c8ad649c67d8ba956_435233652_Screenshot_2023-09-15-01-34-35-035_com alicloud databox _0386e95320daa1e2aeb014fb2c93d0d0_618048712_Screenshot_2023-09-15-01-37-01-909_com alicloud databox

Ryanlyt commented 1 year ago

线性DP

下标从0开始还是从1开始:如果涉及到下标[i - 1]一般从1开始,否则从0开始

状态表示:能做出来的情况下,维数越少越好

DP问题里面用枚举

数字三角形 _c85870c90b8a7fa935880023f0cfee31_-1632936110_Screenshot_2023-09-15-10-01-14-049_com alicloud databox _da688ecdeedeca967ad54cdaf2c5d882_585924247_Screenshot_2023-09-15-10-12-45-277_com alicloud databox _da83ecdd67ada237c414f28116afe6a5_-391333926_Screenshot_2023-09-15-10-19-07-770_com alicloud databox _0ec97e2c3f4d6f3e01dbae818d687c14_-1028172997_Screenshot_2023-09-15-10-19-40-857_com alicloud databox _6a00bd4c666a9cf5335277eecd14e3ae_-691566157_Screenshot_2023-09-15-10-20-45-047_com alicloud databox

最长上升子序列 把序列存储下来(动态规划问题求方案:把转移记录下来) _44bd1aade5ae057c69b2c37358a7f0fb_1025033113_Screenshot_2023-09-15-10-22-51-323_com alicloud databox _33fcc36a872fe51856eee2e4d37df614_931961755_Screenshot_2023-09-15-10-38-56-563_com alicloud databox _5caf1bf844a51e7407d6b6485bf786b4_-1228741671_Screenshot_2023-09-15-10-41-32-350_com alicloud databox _fe67497338e5ef57020f1079c0912eb1_-1840328304_Screenshot_2023-09-15-10-47-47-757_com alicloud databox

最长公共子序列(注意子序列和子串的区别) 当属性为max、min时,划分的子问题可以有重复;求数量时,划分的子问题不能有重复 _66e3ba4fddecdd859b36fca4f078f3a6_1397629011_Screenshot_2023-09-15-10-50-32-244_com alicloud databox _2eac174c7946ad35f4fcd575ecff1366_1836973652_Screenshot_2023-09-15-11-12-02-388_com alicloud databox _d33e6846c892812c4cb32fc8e2ce053b_-1712225454_Screenshot_2023-09-15-11-16-17-599_com alicloud databox

Ryanlyt commented 1 year ago

区间DP

先循环区间长度(从小到大),再循环区间左端点,再枚举决策 要保证每一个要算的状态所依赖的状态都已算好了 石子合并 _c23348304402b14fee0b656bb16b8dc3_-730303848_Screenshot_2023-09-15-21-07-00-349_com alicloud databox _5238070243d829c03c0b3f2b0f5dc13e_-1094451415_Screenshot_2023-09-15-21-10-24-915_com alicloud databox _8ab52d1cda19a60aec0fc9763862c17a_-751027623_Screenshot_2023-09-15-21-14-52-952_com alicloud databox _c8992574cfddfbd13a84435069821a17_1323179416_Screenshot_2023-09-15-21-15-22-302_com alicloud databox _8048865e1c3f9b5f545b11c1c14fd13c_229794616_Screenshot_2023-09-15-21-18-23-568_com alicloud databox _3e494d6fa2d6a13947316ff776ee2884_-335003428_Screenshot_2023-09-15-21-18-32-148_com alicloud databox _fb98dbdd16b585f078ecd68b781d6b8f_-1740104910_Screenshot_2023-09-15-21-27-41-917_com alicloud databox

Ryanlyt commented 1 year ago

计数类DP

整数划分 _914e2c06c3e05f7ded0346932d11c8e8_-1034094011_Screenshot_2023-09-15-21-52-48-706_com alicloud databox _7e3192a2fae5d0cfc2e1eb6658b96f31_1561075448_Screenshot_2023-09-15-21-55-51-445_com alicloud databox _910c9562979c1d43e27c2134f948a9bc_1258184637_Screenshot_2023-09-15-21-56-42-670_com alicloud databox

Ryanlyt commented 1 year ago

数位统计DP

计数问题 _415d70b320a722248fdeb415b3f488d9_-290386104_Screenshot_2023-09-16-01-20-56-816_com alicloud databox

Ryanlyt commented 1 year ago

状态压缩DP

蒙德里安的梦想:把nm的棋盘分成若干个12的长方形,有多少种方案 f(i, j):从i列上一列捅出来的方格的行数,j看作二进制数 _1e97f0d3a004a5caa3ffd3be38a9e1c2_-1383704078_Screenshot_2023-09-16-10-13-45-812_com alicloud databox _3d1d5d6a7aba3634f1f16058cf20663e_63639544_Screenshot_2023-09-16-10-29-40-618_com alicloud databox _26f80b5de09ed285d50ca6f0ba1a28c9_-1490066453_Screenshot_2023-09-16-11-11-04-648_com alicloud databox _81282f4dde40dcff3879ac58f286a19a_-1877163795_Screenshot_2023-09-16-11-11-14-537_com alicloud databox _e986c11f43d31f1fa9d68db651eb6c0f_-1536978860_Screenshot_2023-09-16-11-11-20-788_com alicloud databox

最短哈密尔顿路径 f(i, j):所有从0走到j,走过的所有点是i的所有路径 状态被压缩到了i里,用二进制数表示 先枚举所有状态,再枚举所有转移的状态(指循环写法上的先后) _b8e4a2380dd71b42a02368702fe91f75_1017558961_Screenshot_2023-09-16-11-13-29-003_com alicloud databox _d662300bf6a62ac7d945c35bea4e1600_1879014317_Screenshot_2023-09-16-15-46-22-835_com alicloud databox

n比较小的时候可以考虑能不能用状态压缩dp

Ryanlyt commented 1 year ago

树形DP

没有上司的舞会 f(u, 0):所有从以u为根的子树中选择,并且不选u这个点的方案 f(u, 1):所有从以u为根的子树中选择,并且选u这个点的方案 该题没有告诉根节点是谁,需要用写has_father判断一下:root从1开始枚举,root++,直到没有父节点为止 _20fa5a3f5351879df6a55b7e5e45a40c_-1665368812_Screenshot_2023-09-16-15-49-52-856_com alicloud databox _cdfb042133eb2cd9395572616a8ea62f_-814495061_Screenshot_2023-09-16-15-55-07-663_com alicloud databox _5c1b82ae6cc4f54893ddf0aae62b8bb1_-1485911305_Screenshot_2023-09-16-16-05-50-777_com alicloud databox _d47c8e7abb88d55df357688414f542f6_2141374770_Screenshot_2023-09-16-16-14-40-889_com alicloud databox _f47d405e916fa3039806e11b17eaf1c9_-526957812_Screenshot_2023-09-16-16-14-49-039_com alicloud databox

Ryanlyt commented 1 year ago

记忆化搜索

动态规划的一种实现方式,递归求解(每一道动态规划都可以用递归来写,递归的方式更容易理解) (树形dp是一种特殊的递归方式) 优点:好写,代码复杂度小

滑雪 f(i, j):所有从(i, j)开始滑的路径 先判断,把所有存在的情况枚举一遍 要递归地算每个点的状态:先把每个状态初始化为-1,表示每个状态都没有被算过,然后算最大值,枚举从每个点出发 上下左右技巧:用偏移量 WIFI0s017096843321695004620265 WIFI0s0-8963392221695004620245 WIFI0s0-2044678331695004620226