BZOJ-1010 [HNOI2008]玩具装箱toy
来源:互联网 发布:田井中彩智 现场 知乎 编辑:程序博客网 时间:2024/06/11 01:05
解题思路:
斜率优化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\n", dp[n]);//system("pause");return 0;}
0 0
- BZOJ 1010: [HNOI2008]玩具装箱toy
- BZOJ 1010: [HNOI2008]玩具装箱toy
- BZOJ-1010 [HNOI2008]玩具装箱toy
- BZOJ 1010: [HNOI2008]玩具装箱toy
- 【BZOJ 1010】[HNOI2008]玩具装箱toy
- BZOJ 1010: [HNOI2008]玩具装箱toy
- bzoj 1010 [HNOI2008]玩具装箱toy
- BZOJ 1010 [HNOI2008]玩具装箱toy
- 1010: [HNOI2008]玩具装箱toy
- 1010: [HNOI2008]玩具装箱toy
- 1010: [HNOI2008]玩具装箱toy
- 1010: [HNOI2008]玩具装箱toy
- 1010: [HNOI2008]玩具装箱toy
- BZOJ 1010([HNOI2008]玩具装箱toy-斜率优化)
- BZOJ 斜率优化dp 1010: [HNOI2008]玩具装箱toy
- BZOJ 1010 [HNOI2008]玩具装箱toy(斜率优化)
- bzoj 1010 HNOI2008 玩具装箱toy 斜率优化+DP
- BZOJ 1010 [HNOI2008]玩具装箱toy(斜率优化dp)
- POJ 2115 C Looooops [扩展欧几里得]【数论】[水]
- java.lang.IllegalStateException: The ImageView's ScaleType has been changed
- (第三周项目1)顺序表的基本运算
- thinking in java test chapter9接口(11)~(19)适配器模式,工厂模式
- 单链表的基本操作
- BZOJ-1010 [HNOI2008]玩具装箱toy
- Android开发之Genymotion模拟器初探
- 高效地随机选取数组中的元素
- JAVA基础6.62——接口(2)
- Android Fragment(二)之获取FragmentManager
- mysql多表联结查询
- JavaScript删除数组重复元素的5个高效算法
- java获取当前系统时间
- 线段树