前缀和 & 差分
前缀和
背包问题
对于一个背包问题,有\(q\)个询问,求第\(i\)个物品一定不取时的最大价值。
思路:
1、当\(i=n\)时,只做1~i-1的背包即可;
2、当\(i=1\)时,考虑翻转背包,变成情况1;
3、一般情况下,考虑对每个点做前后缀背包,然后\(O(n)\)合并即可(合并方法类似廊桥);
二维前缀和
方法1:容斥原理
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
方法2:先做一维,再拓展
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++) s[i][j] = s[i][j - 1] + a[i][j];
for (int j = 1; j <= n; j ++)
for (int i = 1; i <= n; i ++) s[i][j] += s[i - 1][j];
两种方法复杂度都为\(O(n^2)\) ,但也有差别。
在k维前缀和中,方法1时间复杂度为\(O(2^kn^k)\),而方法2为\(O(kn^k)\),因此在求高维前缀和时用方法2。
方法2又为sos dp的本质

浙公网安备 33010602011771号