【刷题笔记】DP 2021.10.11

Candies

思路

朴素的算法
\(f_{i,j}\)表示给前\(i\)个小朋友分\(j\)个糖的方案数,

\[f_{i,j}=\sum_{k=0}^{min(a[i],j)}f_{i-1,j-k} \]

注意到此时时间复杂度为\(O(n\times k^2)\)
想到用前缀和进行优化,设\(s_{i,j}\)表示\(\sum_{j=0}^{k}f_{i,j}\)
\(DP\)转移方程

\[f_{i,j}=s_{i-1,j}-s_{i-1,j-a[i]-1}(j-a[i]-1\ge 0)\\ f_{i,j}=s_{i-1,j}(j-a[i]-1<0)\]

答案就是\(f_{n,k}\)

\(code\)

code
注,可以用滚动数组,优化空间复杂度

slimes

思路

十分典的区间\(DP\),注意到性质,若将一个长度为\(n\)的区间相邻两两合并,操作\(n-1\)次后,一定能将其合并为一个长度为\(1\)的区间。
转移方程

\[f_{i,j}=min(f_{i,j},f_{i,k}+f_{k+1,j}+s_j=s_{i-1}) \]

\(s\)是前缀和数组,注意要将枚举区间长度放在最外层。

posted @ 2024-10-11 16:24  GuoSN0410  阅读(10)  评论(0)    收藏  举报