2023 国庆集训 Day 4B 笔记

· · 个人记录

更佳的阅读体验:2023 国庆集训 Day 4B 笔记,本文同步发表于 洛谷博客。

以下内容为个人总结,如有错误或您有不同见解,欢迎指出。

单调队列优化 DP

洛谷 P1886 - 单调队列

int a[N];
deque<int> q;  // 存每个数的下标

for (int i = 1; i <= n; ++i) {
    while (!q.empty() && q.front() <= i - k) q.pop_front();
    while (!q.empty() && a[q.back()] <= a[i])       q.pop_back();
    q.push_back(i);
    cout << a[q.front()] << '\n';
}

洛谷 P2216 - 理想的正方形

洛谷 P2219 - 修筑绿化带

求最大全 0 正方形

给定一个 0 / 1 矩阵,求出最大的全为 0 的子正方形,求不带 \log 的做法。

\log 的做法:枚举每个点作为左上角,二分正方形边长。

带修版本:洛谷 P4259 - 寻找车位

洛谷 P2254 - 瑰丽华尔兹

// 不考虑障碍 且只考虑向上的转移

for (int k = 1; k <= K; ++k) {
    int t_k;
    for (int j = 1; j <= m; ++j) {
        deque<int> q;
        int g[];
        for (int i = 1; i <= n; ++i) g[i] = f[k - 1][i][j] + i;
        for (int i = n; i; --i) {
            while (!q.empty() && q.front() > i + t_k) q.pop_front();
            while (!q.empty() && g[q.back()] <= g[i]) q.pop_back()
            q.push_back(i);
            f[k][i][j] = g[q.front()] - i;
        }
    }
}

洛谷 P4381 - Island

单调队列优化多重背包

一共有 c_ii 号物品,有 w_i 的价值和 v_i 的体积。

洛谷 P5665 - 划分

计数 DP

洛谷 P5824 - 十二重计数法

洛谷 P3702 - 序列计数

洛谷 P3773 - 吉夫特

int a[N], pos[N];

cin >> n;
for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    pos[a[i]] = i;
}

for (int s = VALUE_MAX; s; --s) {
    ++f[s];
    for (int t = (s - 1) & s; t; --t)
        if (pos[s] < pos[t]) f[t] += f[s];
    ans += f[s] - 1;
}

洛谷 P5664 - Emiya 家今天的饭