题链:

斜率优化DP
一个入门题,就不给题解了,网上的好讲解很多的。
 
这里就只提一个小问题吧(好吧,个人觉得这个问题也不小)。
本题的输入数据 A[i] 可能会有很讨厌的 0 出现,
这样的话,完全可能导致 k<j,SUM[k]==SUM[j],DP[k]==DP[j]的情况出现,
 
所以用double型计算斜率肯定会错啦,因为分母会被减成 0,鬼知道会算出来一个什么。
 
另外这样写也会出错: 
在计算完当前的DP值然后入队时,如果采用这种写法,就会WA。
(新点与队列里倒数第一个点的斜率 < 队列里倒数第一个点和倒数第二个点的斜率 时才弹出队尾。)
正确的应该写成小于等于就弹出
(新点与队列里倒数第一个点的斜率 <= 队列里倒数第一个点和倒数第二个点的斜率 时弹出队尾。)
让我们来看看为什么会这样?
同样是会出现 k<j,SUM[k]==SUM[j],DP[k]==DP[j]的情况,
那么由本题的解法,计算斜率时,令 X[j]=2*SUM[j],Y[j]=DP[j]-SUM[j]*SUM[j]
那么反映到平面上,k(X[k],Y[k]),j(X[j],Y[j])就是两个重合的点
这时,如果这两个点都在队列里,(假设j在队尾,k在队列倒数第二个),且又来了一个如下图的新点i要加进队列,会怎样呢?
按算法的逻辑,计算得到i与j的斜率并没有小于j与k的斜率,(再看看判断语句,两边都乘了0),
所以接下来就退出了“弹出队尾”的while循环,然后,我们的下凸包也就没有被维护好:
所以自然错了。
综上,对于本题,因为有0的出现,只有采取 <= 的写法(且不用double计算)才能顺利完成这个入门题。(汗...)
(有点类似求凸包,也要避免重复点带来的影响。)
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 500050
using namespace std;
int DP[MAXN],SUM[MAXN];
int N,M;
int dx(int a,int b){
return 2*(SUM[a]-SUM[b]);
}
int dy(int a,int b){
return (DP[a]+SUM[a]*SUM[a])-(DP[b]+SUM[b]*SUM[b]);
}
int main(){
static int q[MAXN],l,r;
while(~scanf("%d%d",&N,&M)){
for(int i=1;i<=N;i++)
scanf("%d",&SUM[i]),SUM[i]+=SUM[i-1];
l=1; r=1; q[1]=0;
for(int i=1;i<=N;i++){
while(l+1<=r&&dy(q[l+1],q[l])<=SUM[i]*dx(q[l+1],q[l])) l++;
DP[i]=DP[q[l]]+(SUM[i]-SUM[q[l]])*(SUM[i]-SUM[q[l]])+M;
while(l+1<=r&&dy(i,q[r])*dx(q[r],q[r-1])<=dy(q[r],q[r-1])*dx(i,q[r])) r--;
q[++r]=i;
}
printf("%d\n",DP[N]);
}
return 0;
}

  

●HDU 3507 Print Article的更多相关文章

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

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

  2. HDU 3507 Print Article 斜率优化

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

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

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

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

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

  5. HDU 3507 - Print Article - [斜率DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 Zero has an old printer that doesn't work well s ...

  6. HDU 3507 Print Article(CDQ分治+分治DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3507 [题目大意] 将长度为n的数列分段,最小化每段和的平方和. [题解] 根据题目很容易得到dp ...

  7. [HDU 3507]Print Article

    Description Zero has an old printer that doesn't work well sometimes. As it is antique, he still lik ...

  8. 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 ...

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

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

随机推荐

  1. Python打包分发工具setuptools

    作为Python标准的打包及分发工具,setuptools可以说相当地简单易用.它会随着Python一起安装在你的机器上.你只需写一个简短的setup.py安装文件,就可以将你的Python应用打包 ...

  2. OO前三次作业总结

    一.第一次作业 1.程序设计分析 ![img](s1.ax1x.com/2018/04/02/CSgoSU.png) 图1 第一次作业类图 ![name](https://images2018.cnb ...

  3. thinkphp中ajax技术

    thinkphp可以直接返回json数据,json数据事可以跟前端的js通用的

  4. c# 字符串的内存分配和驻留池( 转 )

    刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: string s1 = "he ...

  5. angular2 学习笔记 ( angular cli & npm version manage npm 版本管理 )

    更新 : 2017-05-05 现在流行 Yarn ! 它是 facebook google 推出的东西. 算是补助 npm 做的不够好的地方. 源码依然是发布去 npm,只是下载接口换掉罢了哦. n ...

  6. redis入门(05)redis的key命令

    一.什么是redis键命令 Redis 键(key):Redis 键命令用于管理 redis 的键. Redis 键命令的基本语法: redis 127.0.0.1:6379> COMMAND ...

  7. git常用命令行总结

    Git是当今最流行的版本控制工具.这几年GitHub也干掉了GoogleCode和Sourceforge,从三大代码仓库中脱颖而出,除了GitHub自身的优秀外,Git也是功不可没. 为何Git如此出 ...

  8. javascript学习总结一

    1. 变量提升hoisting 变量提升的意思是在一个变量作用域里定义的变量的声明会被提升到作用域的顶部,这是变量只会被声明,不会被初始化复制,而是undefined. 代码如下: function ...

  9. Http post请求数据分析 --作者, 你的这个需求我可以做, 我在平台上无法给你发消息和接收你的任务, 所以,如果你看到这个信息, 可以联系我.

    Http post请求数据分析 作者, 你的这个需求我可以做, 我在平台上无法给你发消息和接收你的任务, 所以,如果你看到这个信息, 可以联系我. 软件需求就是不停post一个网址,然后根据返回的信息 ...

  10. linux如何安装django

    首先在命令行下输入python 进入界面后先importdjango 如果这一步有错,说明没有django 需要我们安装 源码安装方法: 下载源码包 https://www.djangoproject ...