美文网首页noip(全国青少年信息学奥林匹克联赛)算法
决策单调性优化——另一种DP优化利器

决策单调性优化——另一种DP优化利器

作者: 信息学小屋 | 来源:发表于2020-05-18 21:54 被阅读0次

今天,我们来介绍另一种DP优化方法——决策单调行优化。

决策单调性优化与斜率优化有相似之处,但又有不同之处。 相似之处在于这两者的运用条件都需要满足一个决策如果比另一个决策劣,那么这个决策一定不再是最优决策。不同之处在于,决策单调性优化是为每个决策点分配对应的决策区间,而斜率优化是每个状态自己去寻找相应的决策点。

下面,我们通过一道例题,来深入讲解一下决策单调性优化。

HNOI2008】玩具装箱

(题目图片来源洛谷P3195,侵删)

一种方法

这道题的转移方程还是比较容易写出来的,我们定义f[i]表示前i个玩具装完之后所需要的最小花费,转移方程如下:

转移方程

得到方程后,经过转化可以化成斜率优化的式子(然而它不是今天的主角QAQ),大家可以自己试一试哦。

主角登场

解题过程

Code


#include <bits/stdc++.h>
using namespace std;

const int N = 5e4 + 5;

struct node {
    node() = default;
    node(int _l, int _r, int _id) {
        l = _l; r = _r; id = _id;
    }
    int l, r, id;
}que[N];

long long f[N], sum[N];
int n, l, x, tot, tow;

long long calc(int j, int i) {
    return (f[j] + (sum[i] - sum[j] + i - j - 1- l) * (sum[i] - sum[j] + i - j - 1- l));
}

int find(int l, int r, int i, int j) {
    int mid, ans = r + 1;
    while (l <= r) {
        mid = (l + r) >> 1;
        if (calc(i, mid) > calc(j, mid)) {
            ans = mid;
            r = mid - 1;
        } else l = mid + 1;
    }
    return ans;
}

void solve() {
    que[tot = tow = 1] = node(0, n, 0);
    for (int i = 1; i <= n; ++i) {
        while (que[tot].r < i) tot++;
        f[i] = calc(que[tot].id, i);
        if (tot > tow || calc(i, n) < calc(que[tow].id, n)) {
            while (tot <= tow && calc(i, que[tow].l) < calc(que[tow].id, que[tow].l)) tow--;
            if (tot <= tow) {
                int tmp = find(que[tow].l, que[tow].r, que[tow].id, i);
                que[tow].r = tmp - 1;
                que[++tow] = node(tmp, n, i);
            } else que[++tow] = node(i, n, i);
        }
    }
}

int main () {
    scanf ("%d%d", &n, &l);
    for (int i = 1; i <= n; ++i) {
        scanf ("%lld", &x);
        sum[i] = sum[i - 1] + x;
    }
    solve();
    printf ("%lld\n", f[n]);
    return 0;
}

总结

由于决策单调性优化的程序中无需推导公式(所有的公式推导都是为了证明该问题满足决策单调性),所以在赛场上可以用先猜后证的方法,猜测这道题目满足决策单调性,再用程序证明。

这种做法可以减少思维复杂度,但是要建立在多做题目,有较多经验的基础上,切记不可滥用。

【信息学竞赛从入门到巅峰】,一个专注于分享OI/ACM常用算法及知识的公众号。

相关文章

  • 决策单调性优化——另一种DP优化利器

    今天,我们来介绍另一种DP优化方法——决策单调行优化。 决策单调性优化与斜率优化有相似之处,但又有不同之处。 相似...

  • DP训练——斜率优化DP

    斜率优化DP 斜率优化DP涉及到的模型较多,在编写习题题解前,先做出如下规律总结。 如何识别斜率优化DP 按照正常...

  • dp 动态规划

    定义 动态规划(dynamic programming, DP) 是运筹学的一个分支,是求解决策过程最优化的过程。...

  • 动态规划

    1、简介动态规划(Dynamic Programming,DP)是求解决策过程最优化的过程,把原始问题划分成一系列...

  • 动态规划

    一、简介 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。...

  • 「动态规划」例题之状态和转移方程的优化

    0x50「动态规划」例题 倍增优化DP 有些题目中,为了加速阶段的递推,我们会使用倍增去优化DP过程。通常情况下,...

  • A/B测试- 优化产品黑客利器

    一、什么是增长以及如何实现 二、转化率优化(CRO) 三、如何优化转化率 四、优化常见问题及注意事项 五、优化利器...

  • 前缀和优化DP

    前缀和优化 DP 当 DP 转移方程是如下形式的时候 计算 dp[i] 时需要一步求和 sum(dp[a..b])...

  • 决策树(Decision Tree)算法

    1 理论部分 需要弄清楚几个概念信息熵,决策树,决策树优化, 剪枝 ,决策树可视化 1 信息熵(Entropy 单...

  • 【React.js 20】React性能优化

    React性能优化 React性能优化主要分三块: React 组件性能优化 属性传递优化针对单组件性能优化,很多...

网友评论

    本文标题:决策单调性优化——另一种DP优化利器

    本文链接:https://www.haomeiwen.com/subject/vyxmohtx.html