【DP】hdu3507
2015-12-02 10:31
288 查看
提议就是给出一个非负的序列,然后割成几段,每段的代价是那个公式。
然后dp式很好推也能一眼看出是斜率优化。
(d[i]-d[j]+sum[i]^2-sum[j]^2)/2(sum[i]-sum[j])<sum[k] i>j
被玮神喷基本功不好了,
于是打算多写几个斜率优化练一下,
然后
1,起始项是q[1]=0不是q[1]=1;
2.传参的时候一定要对应,不要传值当做标号用
3.一定要注意队头出队时候写斜率的大小关系
4.不要手残把加号打成减号
5.样例坑爹
然后dp式很好推也能一眼看出是斜率优化。
(d[i]-d[j]+sum[i]^2-sum[j]^2)/2(sum[i]-sum[j])<sum[k] i>j
被玮神喷基本功不好了,
于是打算多写几个斜率优化练一下,
然后
1,起始项是q[1]=0不是q[1]=1;
2.传参的时候一定要对应,不要传值当做标号用
3.一定要注意队头出队时候写斜率的大小关系
4.不要手残把加号打成减号
5.样例坑爹
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<set> using namespace std; long long f[701000],sum[701000]; int n,m,q[701000],a[700100]; bool xl(int x,int y,int z,int w) { if (w==1) { long long tmp1=(f[x]-f[y]+sum[x]*sum[x]-sum[y]*sum[y]); long long tmp2=(f[y]-f[z]+sum[y]*sum[y]-sum[z]*sum[z]); return (tmp1*(sum[y]-sum[z])>=tmp2*(sum[x]-sum[y])); } if (w==2) { return f[y]-f[x]+sum[y]*sum[y]-sum[x]*sum[x]<sum[z]*2*(sum[y]-sum[x]); } } int main() { freopen("test.in","r",stdin); int head,tail; while (~scanf("%d%d",&n,&m)) { head=1;tail=1; memset(sum,0,sizeof(sum)); memset(f,0,sizeof(f)); memset(a,0,sizeof(a)); memset(q,0,sizeof(q)); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } q[1]=0; f[0]=0; sum[0]=0; for (int i=1;i<=n;i++) { while (tail>=head+1&&xl(q[head],q[head+1],i,2)) head++; f[i]=f[q[head]]+(sum[i]-sum[q[head]])*(sum[i]-sum[q[head]])+m; while (tail>=head+1&&xl(q[tail-1],q[tail],i,1)) tail--; q[++tail]=i; } printf("%I64d\n",f ); } return 0; }
相关文章推荐
- 【Information:java: javacTask: 源发行版 1.7 需要目标发行版 1.7】
- svn代码回滚命令
- Linux系统启动流程详解
- Zookeeper超级用户
- 我的大学——学习生活总结
- 每个人都应该知道的14个电脑使用技巧
- Git 的 .gitignore 配置
- SQL基础---增删查询操作
- autoload-cache-2.4 发布
- Spark使用经验分享
- 如何用VisualStudio2013、VisualStudioTools命令行 编写C语言程序
- JAVA AQS源码分析
- 找出文件中的完全平方数
- compass模块----Helpers
- OpenCv ROI操作
- HTTP请求中浏览器的缓存机制
- LeetCode-- Palindrome Number
- SQL----函数
- watchOS 2 教程(四): Watch Connectivity
- c/c++ 数字转字符串, 字符串转数字