【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告
2024-08-31 01:18:51
题目:
思路与做法:
这题不难想。
首先我们先推出一个普通的dp方程:
\(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\)
然后就推一推式子了:
我们来比较计算f[i]时的j和k两个决策
\(f_j+(i-j-1+sum_i-sum_j-L)^2 < f_k+(i-k-1+sum_i-sum_k-L)^2\)
令\(num_i = i+sum_i\)
令\(C = L+1\)
\(f_j+(num_i-num_j-L-1)^2 < f_k+(num_i-num_j-L-1)^2\)
\(f_j+{num_i}^2-2*num_i*(num_j+C)+(num_j+C)^2\)
\(<f_k+{num_i}^2-2*num_i*(num_k+C)+(num_k+C)^2\)
$f_j+(num_j+C)2-f_k-(num_k+C)2 < $
\(2*num_i*(num_j-num_k)\)
\({f_j+(num_j+C)^2-f_k-(num_k+C)^2 \over 2*(num_j-num_k)} < num_i\)
接下来就可以用斜率优化dp了。
代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 50010;
inline long long sqr(long long x) { return x*x; }
long long a[N];
long long sum[N];
long long num[N], C;
long long f[N];
double calc(int j, int k) { return (double)(f[j]+sqr(num[j]+C)-f[k]-sqr(num[k]+C))/(double)(2*(num[j]-num[k])); }
int Q[N], hd, tl;
int main()
{ int n;
long long m;
scanf("%d%lld", &n, &m);
for(int i=1; i<=n; i++)
{ scanf("%lld", &a[i]);
sum[i] = sum[i-1]+a[i];
}
for(int i=1; i<=n; i++) num[i] = sum[i]+i;
C = m+1;
Q[hd = 0] = 0;
tl = 1;
for(int i=1; i<=n; i++)
{ while(hd < tl-1 && calc(Q[hd+1], Q[hd]) <= num[i]) hd++;
f[i] = f[Q[hd]] + sqr(num[i]-num[Q[hd]]-C);
while(hd < tl-1 && calc(i, Q[tl-1]) <= calc(Q[tl-1], Q[tl-2])) tl--;
Q[tl++] = i;
}
printf("%lld\n", f[n]);
return 0;
}
最新文章
- 【powerdesigner】将pdm或者cdm保存为普通图片格式
- 传智播客--ADO.net--SqlBulkCopy批量插入数据(小白必知)
- Qt qml 单例模式
- java中开源日志记录工具log4j
- .NET牛人应该知道些什么
- C#的linq在winform中简单应用
- Windows下elasticsearch插入数据报错!
- jquery属性选择器(匹配具有指定属性的元素)
- ubuntu 安装bochs
- Java_你应该知道的26种设计模式
- C#的委托 Action<;>;和Func<;>;
- JAVA 流式布局管理器
- Smarty中一些标签的使用
- hdu 1540 Tunnel Warfare (区间线段树(模板))
- C# 重写思想
- pch文件的作用和配置
- 办理卡尔加里大学(本科)学历认证『微信171922772』calgary学位证成绩单使馆认证University of calgary
- iOS制作毛玻璃效果
- scala读取解析json文件
- centos7 安装 redis-4.0.9
热门文章
- spring data jpa 、hibernate、jpa之间的关系
- 【SQL】结构化查询语言
- I2C controller core之Bit controller(05)
- AI.框架理论.语义网.语言间距.孤单
- python 生成测试报告并发送邮件
- iframe的2个问题
- js-构造数组
- 子元素设置margin-top作用到了父元素
- 15.3 Task 异常
- 当样式中存在!important时无法使用show()或hide() 2017-06-11 22:25 15人阅读 评论(0) 收藏