BZOJ1010玩具装箱 - 斜率优化dp
题目分析:
设\(f[i]\)表示装前i个玩具的花费。
列出转移方程:$$f[i] = max{f[j] + ((i - (j + 1)) + sum[i] - sum[j] - L))^2}$$
令\(x[i] = sum[i] + i\), \(P = L + 1\),上式化为:
\]
列式并化为斜率形式:\(S(i, j) = \frac{(f[i] + x[i]^2 + 2x[i]P) - (f[j] + x[j]^2 + 2x[j]P)}{2(x[i] - x[j])}\)
然后就是斜率dp了。
code
#include<bits/stdc++.h>
using namespace std;
const int N = 50050;
typedef long long ll;
int n;
ll L, c[N];
typedef long long ll;
ll f[N], x[N], sum[N];
int que[N];
inline ll calc(int i, int j){
return f[j] + (x[i] - x[j] - L) * (x[i] - x[j] - L);
}
inline bool slopeCheck(int i, int j, int k){
return ((f[i] + x[i] * x[i] + 2 * x[i] * L) - (f[j] + x[j] * x[j] + 2 * x[j] * L)) * 2 * (x[j] - x[k]) <=
((f[j] + x[j] * x[j] + 2 * x[j] * L) - (f[k] + x[k] * x[k] + 2 * x[k] * L)) * 2 * (x[i] - x[j]);
}
int main(){
freopen("h.in", "r", stdin);
scanf("%lld%lld", &n, &L);
for(int i = 1; i <= n; i++) scanf("%lld", &c[i]), sum[i] = sum[i - 1] + c[i], x[i] = sum[i] + i;
L += 1;
int head, tail;
que[head = tail = 1] = 0;
for(int i = 1; i <= n; i++){
while(head + 1 <= tail && calc(i, que[head]) >= calc(i, que[head + 1])) head++;
f[i] = calc(i, que[head]);
while(head <= tail - 1 && slopeCheck(i, que[tail], que[tail - 1])) tail--;
que[++tail] = i;
}
printf("%lld", f[n]);
return 0;
}
BZOJ1010玩具装箱 - 斜率优化dp的更多相关文章
- luogu3195/bzoj1010 玩具装箱(斜率优化dp)
推出来式子然后斜率优化水过去就完事了 #include<cstdio> #include<cstring> #include<algorithm> #include ...
- BZOJ 1010 [HNOI2008]玩具装箱 (斜率优化DP)
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 思路 [斜率优化DP] 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i ...
- BZOJ 1010 玩具装箱(斜率优化DP)
dp[i]=min(dp[j]+(sum[i]-sum[j]+i-j-1-L)^2) (j<i) 令f[i]=sum[i]+i,c=1+l 则dp[i]=min(dp[j]+(f[i]-f[j] ...
- HNOI2008玩具装箱 斜率优化
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- BZOJ 1010 HNOI2008 玩具装箱 斜率优化
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1010 Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的 ...
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11893 Solved: 5061[Submit][S ...
- 2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)
传送门 一道经典的斜率优化dp. 推式子ing... 令f[i]表示装前i个玩具的最优代价. 然后用老套路. 我们只考虑把第j+1" role="presentation" ...
- 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告
题目: 题目在这里 思路与做法: 这题不难想. 首先我们先推出一个普通的dp方程: \(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\) 然后就推一推式子了: ...
随机推荐
- Android 利用代码在屏幕中间位置显示ProgressDialog和ProgressBar
package cc.testprogressdialog; import android.os.Bundle; import android.view.Gravity; import android ...
- Redis原理(一)
基础和应用 1.Redis是远程调用技术的首字母缩写. 2.Redis可以用来做什么? Redis可以用来做缓存. 分布式锁 3.Redis的应用举例 记录帖子的点赞数.评论数和点击数.(使用HASH ...
- Ubuntu14.04中踩过的坑
今天安装Ubuntu 14.0.4,因为需要使用python3,所以就直接配置如下:sudo rm /usr/bin/pythonsudo ln -s /usr/bin/python3.5 /usr ...
- HDOJ 5409 CRB and Graph 无向图缩块
无向图缩块后,以n所在的块为根节点,dp找每块中的最大值. 对于每一个桥的答案为两块中的较小的最大值和较小的最大值加1 CRB and Graph Time Limit: 8000/4000 MS ( ...
- Java反射机制的简单应用
一直感觉java的反射机制非常强大,可是可用的地方不多.在android学习的时候.一直想实现挂断电话的功能,可是系统并没有提供开放的api接口,看了一下网上使用反射机制来实现该功能,确实非常强大,非 ...
- vue学习笔记二:v-if和v-show的区别
v-if vs v-show v-if 是“真正的”条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建. v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做—— ...
- 使用openoffice转换ms_office to pdf
java源代码: package com.jeecms.common.office2pdf; import java.io.File; import java.io.FileInputStream; ...
- Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层訪问硬件驱动 中我们已经编译好了硬件抽象层模块,以下就要開始为H ...
- JMS是一种应用于异步消息传递的标准API
JMS是一种应用于异步消息传递的标准API,作为Java平台的一部分,JMS可以允许不同应用.不同模块之间实现可靠.异步数据通信.一些概念 JMS provider An implementat ...
- arm交叉编译Valgrind
1. wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2 tar xvf valgrind-3.9.0.tar.bz2 cd valgr ...