斜率优化板题 HDU2829 Lawrence
- 题目大意:给定一个长度为nnn的序列,至多将序列分成m+1m+1m+1段,每段序列都有权值,权值为序列内两个数两两相乘之和。求序列权值和最小为多少?
- 数据规模:m<=n<=1000.m<=n<=1000.m<=n<=1000.
- 分析:令w[i,j]w[i,j]w[i,j]表示区间[i,j][i,j][i,j]中两两乘积之和,f[i][j]f[i][j]f[i][j]表示前jjj个数分成iii段的最小值。
f[i][j]=f[i−1][k]+w[k+1,j]f[i][j]=f[i-1][k]+w[k+1,j]f[i][j]=f[i−1][k]+w[k+1,j]
w[k+1,j]w[k+1,j]w[k+1,j]可以转换为w[1,j]−w[1,k]−sum[k]∗(sum[j]−sum[k])w[1,j]-w[1,k]-sum[k]*(sum[j]-sum[k])w[1,j]−w[1,k]−sum[k]∗(sum[j]−sum[k])
其中sum[j]sum[j]sum[j]表示前j个数的前缀和。令w[i]=w[1,i]w[i]=w[1,i]w[i]=w[1,i]
f[i][j]=f[i−1][k]+w[j]−w[k]−sum[k]∗(sum[j]−sum[k])f[i][j]=f[i-1][k]+w[j]-w[k]-sum[k]*(sum[j]-sum[k])f[i][j]=f[i−1][k]+w[j]−w[k]−sum[k]∗(sum[j]−sum[k])
y=f[i−1][k]−w[k]+sum[k]2y=f[i-1][k]-w[k]+sum[k]^2y=f[i−1][k]−w[k]+sum[k]2
x=sum[k]x=sum[k]x=sum[k]
k=sum[j]k=sum[j]k=sum[j]
g=f[i][j]−w[j]g=f[i][j]-w[j]g=f[i][j]−w[j]
则有:y−kx=by-kx=by−kx=b
此为直线方程,kkk为定值,要求bbb(w[j]w[j]w[j]为定值)最小,即为直线的截距最小。平面上有若干点(x,y)(x,y)(x,y),这些点是由各个决策点产生的。而将直线从下往上平移,它接触到的第一个点即为最佳决策点。因为斜率bbb是上升的,所以,下一阶段的直线方程斜率更高,于是最佳决策点一定形成了下凸包序列。
还可以用滚动数组…具体见代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
#define LL long long
int n, m, s, t, dq[MAXN];
LL sum[MAXN], w[MAXN], f[2][MAXN];
inline LL Getup(int now, int i, int j) { return (f[now][i] + sum[i]*sum[i] - w[i]) - (f[now][j] + sum[j]*sum[j] - w[j]); }//Yi-Yj
inline LL Getdown(int now, int i, int j) { return sum[i] - sum[j]; }//Xi-Xj
int main ()
{
int x;
while(scanf("%d%d", &n, &m), n || m)
{
for(int i = 1; i <= n; i++)
scanf("%d", &x), sum[i] = sum[i-1] + x, w[i] = w[i-1] + sum[i-1] * x;
int now = 0;
for(int i = 1; i <= n; i++) f[now][i] = w[i];
for(int i = 2; i <= m+1; i++)
{
now ^= 1, s = t = 0, dq[t++] = 0;
for(int j = 1; j <= n; j++)
{
while(t-s > 1 && Getup(now^1, dq[s+1], dq[s]) <= sum[j] * Getdown(now^1, dq[s+1], dq[s])) s++;
f[now][j] = f[now^1][dq[s]] + w[j] - w[dq[s]] - sum[dq[s]] * (sum[j] - sum[dq[s]]);
while(t-s > 1 && Getup(now^1, j, dq[t-1]) * Getdown(now^1, dq[t-1], dq[t-2]) <= Getup(now^1, dq[t-1], dq[t-2]) * Getdown(now^1, j, dq[t-1])) t--;
dq[t++] = j;
}
}
printf("%lld\n", f[now][n]);
}
}
斜率优化板题 HDU2829 Lawrence的更多相关文章
- 斜率优化板题 HDU 3507 Print Article
题目大意:输出N个数字a[N],输出的时候可以连续的输出,每连续输出一串,它的费用是 "这串数字和的平方加上一个常数M".n<=500000 我们设dp[i]表示输出到i的时 ...
- 斜率优化第一题! HDU3507 | 单调队列优化DP
放一手原题 题解: 第一次写(抄)斜率优化,心里还是有点小激动的.讲一下怎么实现的! 首先我们可以考虑一个朴素的dp:DP[i]表示前i个数字的最少花费,显然我们有一个转移方程 DP[i]=min{D ...
- 斜率优化入门题题单$QwQ$
其实就是这一篇的那个例题帕的大部分题目的题解就写这儿辣,,, 因为都是些基础题不想专门给写题解,,,但是又掌握得差不得不写,,, 麻油办法就写一块儿好辣$QwQ$ 当然辣比较难的我就没放进来辣$QwQ ...
- 【DP】斜率优化
斜率优化 入门题:PKU3709 很多人貌似都是做这道题来K斜率优化的,所以看了资料以后还是开始入手吧. 然而还是得跪求大神的程序啊 ORZ ORZ…… 其实理解斜率优化就是会列斜率不等式,还要理解剔 ...
- 玩具装箱 bzoj1010 斜率优化
斜率优化的题好像都是这样的方程:左边关于j,k的一个(...)/(...)的式子,右边是个只与i有关的可算的数字: 然后把它放到二维坐标轴上,用单调队列维护一个凸壳,O(n)的复杂度: 这道题但是我发 ...
- 【BZOJ2684】【CEOI2004】锯木厂选址(斜率优化,动态规划)
[BZOJ2684][CEOI2004]锯木厂选址(斜率优化,动态规划) 题面 万恶的BZOJ因为权限题的原因而做不了... 我要良心的提供题面 Description 从山顶上到山底下沿着一条直线种 ...
- 斜率优化入门学习+总结 Apio2011特别行动队&Apio2014序列分割&HZOI2008玩具装箱&ZJOI2007仓库建设&小P的牧场&防御准备&Sdoi2016征途
斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ; 1<=j<i (O(n^2)暴力)这样一个式子,首 ...
- 斜率优化dp 的简单入门
不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...
- BZOJ3156 防御准备 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8688187.html 题目传送门 - BZOJ3156 题意 长为$n$的序列$A$划分,设某一段为$[i,j] ...
随机推荐
- Python实现字典树
字典树,又称单词查找树,Trie 树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串 ...
- Data-Structure-Notes
Data Structure Notes Chapter-1 Sorting Algorithm Selection Sorting: /* * Selection Sort */ template& ...
- 什么是PHP?
PHP起源于1995年,由Rasmus Lerdorf开发.到现在,PHP已经历了21年的时间洗涤,成为全球最受欢迎的脚本开发语言之一.由于PHP 5是一种面向对象.完全跨平台的新型Web开发语言.所 ...
- Locust性能测试_参数关联
前言 前面[Locust性能测试2-先登录场景案例]讲了登录的案例,这种是直接传账号和密码就能登录了,有些登录的网站会复杂一点, 需要先从页面上动态获取参数,作为登录接口的请求参数,如[学信网:htt ...
- java之mybatis之配置文件讲解
1.核心配置文件 <configuration> <!-- 它们都是外部化,可替代的属性.可以配置在一个典型的Java 属性文件中,或者通过 properties 元素的子元素进行配 ...
- FORM表单 onclick()与onsubmit()
FORM表单中onclick().submit()与onsubmit()的问题 最近遇到一次处理form数据的过滤,采用了button的onclick事件来检查,发现return false后表单仍然 ...
- 【WEB基础】HTML & CSS 基础入门(1)初识
前面 我们每天都在浏览着网络上丰富多彩的页面,那么在网页中所呈现出的绚丽多彩的内容是怎么设计出来的呢?我们想要自己设计一个页面又该如何来做呢?对于刚刚接触网页设计的小伙伴来说,看到网页背后的一堆符号和 ...
- js节流与防抖函数封装
js节流与防抖函数封装 常见应用场景: window的 resize 和 scroll 事件: 文字输入时的 keyup 事件: 元素拖拽.移动时的 mousemove 事件: 防抖 定义:多次触发事 ...
- 笔记本端查看以前的wifi密码
家里老人忘记密码了.好像是我改了从,我也忘了,手中安卓手机root后也没找到记录密码的文件,水果机懒得弄了,突然想起来电脑还有记录,应该可以找到. 此篇也顺带记录下怎么通过手中笔记本找到以前练过的wi ...
- 在eclipse下给android应用添加jar包
右键工程,Build path,java build path,选择libraries在右边的按钮中点击“Add Library”选择“User library”,点击“下一步”点击“User lib ...