• BZOJ-1010 [HNOI2008]玩具装箱toy


    解题思路:

    斜率优化DP

    这道题= =嘛算是斜率优化的入门题目了。还是非常经典的感觉。

    首先考虑,这道题目有经验的小伙子一眼就可以想出来状态转移方程是什么。

    显然是 dp[i] = min(dp[i], dp[j] + pow(sum[i] - sum[j] + i - j - 1 - L, 2));

    但是想出来之后,想都不用想就知道这个题目,显然是不会是这么简单就能解决的了。

    因为n是5w,如果直接按照这个式子,肯定GG

    那么应该怎么写呢。

    这里推荐一个斜率优化的博客。写的非常好,基本上按照这个博客= =你就可以基本理解斜率优化是怎么回事了。

    传送门在这里http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html

    然后就是基本的随意推理一下,就可以得出最后斜率的表达式:

    [(dp[i] + (sum[i] + i) ^ 2) - (dp[j] + (sum[j] + j) ^ 2)] /  [2 * ((sum[i] + i) - (sum[j] + j))] < [(sum[i] + i) - (L + 1)]

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    typedef long long LL;
    const int maxn = 50005;
    
    LL a, n, l, head, tail;
    LL q[maxn], dp[maxn], sum[maxn];
    
    inline LL fun(LL x) {
    	return x * x;
    }
    inline LL getDp(LL i, LL j) {
    	return dp[j] + fun(i - j - 1 + sum[i] - sum[j] - l);
    }
    inline LL getUp(LL i, LL j) {
    	return ((dp[i] + fun(sum[i] + i)) - (dp[j] + fun(sum[j] + j)));
    }
    inline LL getDown(LL i, LL j) {
    	return 2 * ((sum[i] + i) - (sum[j] + j));
    }
    int main() {
    	scanf("%lld%lld", &n, &l);
    	for (int i = 1; i <= n; ++i) {
    		scanf("%lld", &a);
    		sum[i] = sum[i - 1] + a;
    	}
    	head = tail = 0;
    	q[tail++] = 0;
    	for (int i = 1; i <= n; ++i) {
    		while (head + 1 < tail && getUp(q[head + 1], q[head]) <= (sum[i] + i - l - 1) * getDown(q[head + 1], q[head])) ++head;
    		dp[i] = getDp(i, q[head]);
    		while (head + 1 < tail && getUp(i, q[tail - 1]) * getDown(q[tail - 1], q[tail - 2]) <= getUp(q[tail - 1], q[tail - 2]) * getDown(i, q[tail - 1])) --tail;
    		q[tail++] = i;
    	}
    	printf("%lld
    ", dp[n]);
    	//system("pause");
    	return 0;
    }


  • 相关阅读:
    Linux终端以及bash
    初识VIM
    基础命令
    目录结构和命令
    Xshell连接Centos7.5和yum
    Linux的发展史和centos7的安装
    学习方法以及计算机硬件基础
    mysql、MariaDB的简单操作
    yum 软件管理器
    基础面试题
  • 原文地址:https://www.cnblogs.com/wiklvrain/p/8179357.html
Copyright © 2020-2023  润新知