题链:

斜率优化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. 【技巧】Java工程中的Debug信息分级输出接口及部署模式

    也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...

  2. 自定义SpringBoot启动banner

    序: springboot启动的时候会有一个启动logo似的东西,如图,这个logo似的东西叫做banner,本文小计修改此banner显示与关闭banner.没什么用,有兴趣可以玩玩-- 正文: 自 ...

  3. js判断语句关于true和false后面跟数字或字符串的问题

    我经常在代码中看到很长串判断,看到就头疼,简单的整理一下. 比如:(client.top>=0&&client.left>=0&&client.bottom ...

  4. 【原创】公司各个阶段 CTO 需要做什么?(上篇)

    CTO 是企业内技术最高负责人,对企业的发展起到至关重要的作用.但随着公司的不断发展,CTO 的工作重心也会不断变化.只有在正确的阶段做正确的事,才能更好地为公司做出贡献.我是空中金融 CTO ,TG ...

  5. Linux入门:usermod - 修改用户帐户信息

    一.什么是usermod? usermod 命令通过修改系统帐户文件来修改用户账户信息usermod [options] user_name选项(options)-a|--append ##把用户追加 ...

  6. SQL查询语句练习

    最近在学习SQL嘛,所以各个地方找题目来练手,毕竟现在能离得开数据库么? Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C ...

  7. js中的caller属性和callee属性

    应该用"属性"来称呼caller和callee,而不是方法. caller:返回调用当前函数的函数的引用.a调用b,则返回a(a是boss,因为a把b叫过去干活了): callee ...

  8. c++中的类之构造函数

    一.构造函数的缘由 本文我们主要来讲解c++中类的构造函数,其中涉及了深拷贝和浅拷贝的问题,这也是在面试笔试中经常会碰到的问题.如果您是第一次听说构造函数,可能会觉得这个名字有点高大上,而它却和实际中 ...

  9. 生成git私钥

    在git已经安装的情况下,输入命令: 一.设置git的user name和email git config —(此处两个横杠)global user.name “XXX” git config —(此 ...

  10. wmv12下安装centos7

    第一步:安装软件: vmw版本是12,并在vmw下安装centos为CentOS-7-x86_64-DVD-1708.iso: 第二步:修改vmw虚拟网络配置 1)配置VMnet8 修改ip等信息 点 ...