题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507

题解:显然这题的递推很容易得到

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

显然这样的要两个for肯定超时。这里就要用到斜率优化。

不妨设k<j<i;

显然这里j是最优解所以dp[j]+m+(sum[i]-sum[j])^2<dp[k]+m+(sum[i]-sum[k])^2化简一下就是

(dp[j]+num[j]^2-(dp[k]+num[k]^2))/(2*(num[j]-num[k]))<sum[i],设yj = dp[j]+num[j]^2,yk=dp[k]+num[k],xj=2*num[j],xk=2*num[k]

那么就是(yj-yk)/(xj-xk)<sum[i];这时候是j为k道i之间的最优解

不妨设g[j , k]=(yj-yk)/(xj-xk)

依旧设k<j<i;

如果g[i,j]<g[j,k],那么j点便永远不可能成为最优解

当g[i,j]<sum[i],那么就是说i点要比j点优,排除j点。

当g[i,j]>=sum[i],那么j点此时是比i点要更优,但是同时g[j,k]>g[i,j]>sum[i]。这说明还有k点会比j点更优,同样排除j点。

所以只有在g[i,j]>=g[j,k]时j才有可能是最优解

那么这样就可以利用单调队列来优化了。

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int M = 5e5 + 10;
ll a[M] , dp[M] , sum[M];
int q[M] , n , m;
ll get_up(int i , int j) {return (dp[i] + sum[i] * sum[i]) - (dp[j] + sum[j] * sum[j]);
}
ll get_down(int i , int j) {return (2 * sum[i] - 2 * sum[j]);
}
ll get_dp(int i , int j) {return dp[j] + (sum[i] - sum[j]) * (sum[i] - sum[j]) + m;
}
int main() {while(scanf("%d%d" , &n , &m) != EOF) {sum[0] = dp[0] = 0;for(int i = 1 ; i <= n ; i++) {scanf("%lld" , &a[i]);sum[i] = sum[i - 1] + a[i];}int head = 0 , tail = 0;q[tail++] = 0;for(int i = 1 ; i <= n ; i++) {while(head + 1 < tail && get_up(q[head + 1] , q[head]) <= sum[i] * get_down(q[head + 1] , q[head])) head++;dp[i] = get_dp(i , q[head]);while(head + 1 < tail && get_up(i , q[tail - 1]) * get_down(q[tail - 1] , q[tail - 2]) <= get_up(q[tail - 1] , q[tail - 2]) * get_down(i , q[tail - 1]))tail--;q[tail++] = i;}printf("%lld\n" , dp[n]);}return 0;
}

转载于:https://www.cnblogs.com/TnT2333333/p/7772538.html

hdu 3507 Print Article(dp+斜率优化)相关推荐

  1. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  2. HDU 3507 Print Article(单调队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题意:给出一个数列C,一个数字M,将数列分成若干段,每段的代价为(设这段的数字为k个): 求一种 ...

  3. C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )

    链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...

  4. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  5. BZOJ 3156: 防御准备( dp + 斜率优化 )

    dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...

  6. 【BZOJ-3156】防御准备 DP + 斜率优化

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 951  Solved: 446 [Submit][Status][Discus ...

  7. [HNOI2008]玩具装箱toy(dp+斜率优化)

    斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i  ,  f[i]=sum[i]+i ,  c=L+1; 首先我们能 ...

  8. UVAlive 6131 dp+斜率优化

    这道题和06年论文<从一类单调性问题看算法的优化>第一道例题很相似. 题意:给出n个矿的重量和位置,这些矿石只能从上往下运送,现在要在这些地方建造m个heap,要使得,sigma距离*重量 ...

  9. P3994 高速公路 树形DP+斜率优化+二分

    $ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...

最新文章

  1. IE8经常停止工作和显示异常
  2. POJ 3259 Wormholes(负权环路)
  3. 计算机界名人榜-----约翰·冯·诺依曼
  4. Jboss4集群配置【转】
  5. 重拾强化学习的核心概念_强化学习的核心概念
  6. 红帽企业linux4参考指南读书笔记-GRUB引导器
  7. 数据结构 - 栈(链表实现栈的入栈出栈)
  8. js获取php单选按钮值,js如何获取radio单选框选中的值
  9. linux多线程时序问题,Linux时序竞态问题(sleep函数的实现)
  10. Spring官方推荐的@Transactional还能导致生产事故?
  11. qq永久删除的照片怎么恢复?教你两招轻松恢复
  12. 深信服AC1100上网行为管理
  13. Python爬取豆瓣各类电影排行榜
  14. element 绘制饼状图(复制代码直接用),付效果图
  15. 【数学建模】最小二乘回归+Java代码实现
  16. 如何解决海外邮件发不出去
  17. Android商城排版,android排版布局学习
  18. 卡巴斯基实验室被独立研究机构评选为领导者
  19. SDU_week4_A - DDL 的恐惧(贪心+作业调度问题)
  20. 如何高效地使用 OneNote

热门文章

  1. 在Centos环境下搭建Confluence
  2. Hadoop学习笔记—16.Pig框架学习
  3. DML、DDL、DCL区别
  4. 统治世界的十大算法(转)
  5. .net 中应用 ValidationAttribute
  6. python 黏贴版 pyperclip
  7. 粒子群优化算法(1)
  8. es6 嵌套数组循环_ES6 常用数组循环
  9. android程序的建立,创建第一个Android程序 HelloWorld
  10. Linux Python 安装第三方库时报错 package wheel is not installed