【刷题笔记】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\)是前缀和数组,注意要将枚举区间长度放在最外层。

浙公网安备 33010602011771号