题意:

有 N 个单词,打印第 i 个单词需要 Ci 的费用,并且 K 个单词在一行打印时会产生一个费用和。求最小总费用。

思路:

1. 转移方程为:dp[i] = dp[j] + cost[j+1, i]; 其中 j ∈ [0, i), cost[j+1, i] = (C[i] - C[j])+ M;

2. 常规方法枚举的话,时间复杂度为 O(N2); 想办法对 cost 展开利用斜率优化降低时间复杂度。

3. dp[i] = dp[j] + Cj- 2 * Ci * Cj + Ci2 +M; -> Y = dp[j] + Cj2, X = Cj, a = 2 * Ci(递增);利用下凸函数特性以及队列解题。

4. 题目中有个特殊的地方也需要考虑:当某个单词打印费用为 0 时,Ci = Cj -> dp[i] = dp[j]; 去除重复元素即可。

#include <iostream>
#include <algorithm>
using namespace std;const int MAXN = 500010;long long int dp[MAXN], C[MAXN];
int deq[MAXN];inline double slope(int i, int j)
{return (double)(dp[i] + C[i] * C[i] - dp[j] - C[j] * C[j]) / (C[i] - C[j]);
}int main()
{int N, M;while (scanf("%d %d", &N, &M) != EOF){C[0] = 0;for (int i = 1; i <= N; ++i)scanf("%lld", &C[i]), C[i] += C[i-1];int s = 0, e = 0;for (s = 1, e = 1; e <= N; ++e)if (C[s] != C[e])C[++s] = C[e];N = s;s = e = 0;dp[0] = deq[s] = 0;for (int i = 1; i <= N; ++i){while (s < e && slope(deq[s+1], deq[s]) <= (double)(2 * C[i]))++s;int j = deq[s];dp[i] = dp[j] + (C[i] - C[j]) * (C[i] - C[j]) + M;while (s < e && slope(deq[e], deq[e-1]) >= slope(i, deq[e]))--e;deq[++e] = i;}printf("%lld\n", dp[N]);}return 0;
}

转载于:https://www.cnblogs.com/kedebug/archive/2013/03/04/2942590.html

HDOJ 3507 Print Article(DP + 斜率优化)相关推荐

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

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

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

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

  3. hdu 3507 Print Article(dp+斜率优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...

  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号城市,每个城市都有一家本地的客运公司,可以发车 ...

  10. FZU - 2302  Necklace (dp+斜率优化)

    I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...

最新文章

  1. No cached version of com.android.tools.build:gradle:2.0.0 available for offline mode.
  2. TCP粘包问题 转自CSDN
  3. 积木式开发中Session的处理问题
  4. 107.网络服务质量包括哪些(QoS)
  5. Django(part18)--静态文件
  6. [蓝桥杯][历届试题]小朋友排队(树状数组)
  7. 向张小龙开炮!百度祭出智能小程序
  8. 为ASP.NET MVC Client-side Resource Combine 添加中文支持
  9. linux下gcc/g++命令
  10. Struts如何获取客户端ip地址
  11. NGN学习笔记8——NGN的安全问题
  12. Easyui常用按钮图标汇总
  13. VPX信号处理板学习资料第274篇:基于XC7V690T的3U VPX信号处理板
  14. arccatalog点要素显示不完_2020年仅剩100天,你的年假休完了吗?关于年假你不知道的7点!...
  15. ant design pro中权限组件Authorized的个人学习
  16. 如何在电脑中找到Win10自带锁屏壁纸
  17. vin端口是什么意思_5G新在哪儿(6)?-天线端口的故事
  18. 服务器常用语言,计算机常用词汇--语言及服务器篇
  19. Openstack Train版搭建
  20. 解决 Linux 系统,出现“不在sudoers文件中,此事将被报告”的问题

热门文章

  1. windows server 2008配置之AD域服务器 2
  2. java 中的随机数
  3. Mac下ssh连接远程服务器时自动断开问题
  4. SSAS知识回放之订单数据分析
  5. Firefox历史版本下载
  6. 设计模式(二)--单例模式
  7. Python3 uniform() 函数
  8. babel-preset-env使用介绍
  9. classNotFound异常的一个原因
  10. OPEN SQL中通配符的使用