HDU3507 Print Article(斜率优化dp)

时间:2022-03-17 03:07:17

前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html

上面讲的很详细,但是实际上有些地方貌似是不小心写错了,所以我也来复述一下感悟一下收获。

首先题意是比较明确的,如果我们定义dp[i]为打印到第i个字符时的最小花费的话,显然有下面的转移:

dp[i]=dp[j]+(sum[i]-sum[j])^2+m

然后我们考虑k<j<i时的情况,如果说我们求dp[i]的时候选择j比选择k更优,就会有:

dp[j]+(sum[i]-sum[j])^2+m>dp[k]+(sum[i]-sum[k])^2+m

然后化简就会有:

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

然后左边的项看上去是非常像斜率的,所以我们可以定义一个g[j,k]=(dp[j]+sum[j]^2)-(dp[k]-sum[k]^2)/2*(sum[j]-sum[k])

g[j,k]<sum[i]就表示了j点比k点更优。

考虑a<b<c的情况  g[c,b]<g[b,a]的时候说明什么了呢??

如果g[c,b]<sum[c]  那么 c比b更优

如果g[c,b]>=sum[c],则g[b,a]>g[c,b]>=sum[c] 说明 a比b更优

所以如果(c,b)的斜率<(b,a)的斜率那么 b点是不用考虑的。

基于这一点我们可以用一个队列,像求凸包一样去维护可行的点集。由于g[c,b]<g[b,a]的情况不存在,所以只有g[c,b]>=g[b,a],因此点集应该是上凸的

所以对于队列一开始的点集,如果队首元素的斜率g(que[qh+1],que[qh])<sum[i]的话,那么我们可以将队首元素弹出

(其实一般情况下应该是不可以的,但由于sum[i]是递增的,所以在求dp[i]时有g(que[qh+1],que[qh])<sum[i],dp[i+1]也有g(que[qh+1],que[qh])<sum[i+1],因此队首的元素一定是不用考虑的)

然后直到我们找到一个可行解。

然后就将现在的元素插入队尾,插入队尾的时候就要维护下凸的性质,大概就是这样子。

原博客讲的十分的清楚,然后评论里也讲了一些存在的纰漏和补充的地方,原博的下凸应该改为上凸吧,还有就是弹队首的时候还是要多加说明可能会更好。

#pragma warning(disable:4996)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
using namespace std; #define ll long long
#define maxn 510000 ll dp[maxn];
ll sum[maxn];
ll a[maxn];
int n, m; int que[maxn];
int qh, qt; ll getup(int i, int j){
return (dp[i] + sum[i] * sum[i]) - (dp[j] + sum[j] * sum[j]);
} ll getdown(int i, int j){
return 2 * (sum[i] - sum[j]);
} int main()
{
while (cin >> n >> m){
a[0] = sum[0] = 0;
for (int i = 1; i <= n; ++i){
scanf("%I64d", a + i);
sum[i] = sum[i - 1] + a[i];
}
dp[0] = 0;
qh = qt = 0;
que[qt++] = 0; for (int i = 1; i <= n; ++i){
while (qh + 1 < qt && getup(que[qh + 1], que[qh]) <= getdown(que[qh + 1], que[qh]) * sum[i]){
qh++;
}
dp[i] = dp[que[qh]] + (sum[i] - sum[que[qh]])*(sum[i] - sum[que[qh]]) + m;
while (qh + 1 < qt && getup(i, que[qt - 1])*getdown(que[qt - 1], que[qt - 2]) <= getup(que[qt - 1], que[qt - 2])*getdown(i, que[qt - 1])){
qt--;
}
que[qt++] = i;
}
printf("%I64d\n", dp[n]);
}
return 0;
}

HDU3507 Print Article(斜率优化dp)的更多相关文章

  1. HDU3507 Print Article —— 斜率优化DP

    题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others)    Mem ...

  2. hdu3507 Print Article&lbrack;斜率优化dp入门题&rsqb;

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  3. &lbrack;hdu3507 Print Article&rsqb;斜率优化dp入门

    题意:需要打印n个正整数,1个数要么单独打印要么和前面一个数一起打印,1次打印1组数的代价为这组数的和的平方加上常数M.求最小代价. 思路:如果令dp[i]为打印前i个数的最小代价,那么有 dp[i] ...

  4. HDU3507 Print Article &lpar;斜率优化DP基础复习&rpar;

    pid=3507">传送门 大意:打印一篇文章,连续打印一堆字的花费是这一堆的和的平方加上一个常数M. 首先我们写出状态转移方程 :f[i]=f[j]+(sum[i]−sum[j])2 ...

  5. hdu 3507 Print Article&lpar;斜率优化DP&rpar;

    题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的 ...

  6. Print Article &sol;&sol;&sol; 斜率优化DP oj26302

    题目大意: 经典题 数学分析 G(a,b)<sum[i]时 a优于b G(a,b)<G(b,c)<sum[i]时 b必不为最优 #include <bits/stdc++.h& ...

  7. hdu 3507 Print Article —— 斜率优化DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3507 设 f[i],则 f[i] = f[j] + (s[i]-s[j])*(s[i]-s[j]) + m ...

  8. hdu3507Print Article&lpar;斜率优化dp&rpar;

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  9. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

随机推荐

  1. ASP&period;NET管道

    以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET运行时尚未加载).IIS 6引入了应用程序池的概念,一个工作进程对应着一个应用程 ...

  2. ASP&period;NET 4&period;0 取消表单危险字符验证

    /// <summary> /// ASP.NET4.0 表单验证类 /// </summary> public class FormRequestValidation : R ...

  3. Windows下Faster-RCNN的使用

    上一篇随笔中包含了关于faster rcnn的介绍. 安装与使用 1.下载Faster R-CNN源码(https://github.com/ShaoqingRen/faster_rcnn)2.安装 ...

  4. Web服务器原理及简单实现

    Web系统由客户端(浏览器)和服务器端两部分组成.Web系统架构也被称为B/S架构.最常见的Web服务器有Apache.IIS等,常用的浏览器有IE.Firefox.chrome等.当你想访问一个网页 ...

  5. C&plus;&plus; 中vector的基本用法

    //在网上看了好久,自己总结了一下下,第一篇博客,呼呼,学到不少 基本概念 vector容器是一个模板类,可以存放任何类型的对象).vector对象可以在运行时高效地添加元素,并且vector中元素是 ...

  6. Oracle数据库编程:PL&sol;SQL编程基础

    2.PL/SQL编程基础: PL/SQL块:        declare        定义部分        begin        执行部分        exception        异 ...

  7. php 之 post json 数据

    原文链接 http://www.jb51.net/article/27312.htm 最近用到python 与PHP交互,phthon把json数据post给PHP,但在PHP里面$_post获取不到 ...

  8. Asp&period;Net WebApi swagger使用教程

    swagger简介 别名:丝袜哥 功能:用于生产api文档 swagger安装 Nuget搜索swagger,然后安装Swashbuckle swagger使用 生成api的xml文档 webapi项 ...

  9. SDWebImage 加载Https自签名证书时的图片问题

    你是否遇到了这种情况,好不容易把自签名HTTPS证书配置好了,访问https接口也成功了,但是图片加载不出来? 传了SDWebImageAllowInvalidSSLCertificates 还是没效 ...

  10. sqlserver索引的原理及索引建立的注意事项小结

    聚集索引,数据实际上是按顺序存储的,数据页就在索引页上.就好像参考手册将所有主题按顺序编排一样.一旦找到了所要搜索的数据,就完成了这次搜索,对于非聚集索引,索引是安全独立于数据本身结构的,在索引中找到 ...