前缀和 & 差分

前缀和

背包问题

对于一个背包问题,有\(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的本质

差分

树上差分

posted @ 2024-10-31 17:09  Zhone_lb  阅读(15)  评论(0)    收藏  举报