bzoj 1911: [Apio2010]特别行动队 2011-12-26
2016-03-02 20:15
288 查看
1911: [Apio2010]特别行动队
Time Limit: 4 Sec Memory Limit: 64 MB
Submit: 892 Solved: 359
[Submit][Status][Discuss]
Description
Input
Output
Sample Input4
-1 10 -20
2 2 3 4 Sample Output9HINT
Source
_________________________________________
很简单的动规方程: F[i]:=max(F[j]+a*(s[i]-s[j])^2+b*(s[i]-s[j])+c)
用斜率式优化:
原方程展开: F[i]:=max(F[j]+a*s[i]^2-2*a*s[i]*s[j]+a*s[j]^2+b*s[i]-b*s[j]+c)
设g(i,j)为 F[i] 的一个决策
则 g(i,j)-g(i,k)=f[j]+a*s[j]^2-(f[k]+a*s[k]^2)-(b+a*s[i]^2)*(s[j]-s[k])
当 决策j 优于决策 k时 g(i,j)-g(i,k)>0
设 y[i]=f[i]+a*s[i]^2 , x[i]=s[i]
所以可化简为 (y[k]-y[j])/(x[i]-x[j])>b+a*s[i]^2
因为 a<0 所以 b+a*s[i]^2 单调递减。
_________________________________________
Time Limit: 4 Sec Memory Limit: 64 MB
Submit: 892 Solved: 359
[Submit][Status][Discuss]
Description
Input
Output
Sample Input4
-1 10 -20
2 2 3 4 Sample Output9HINT
Source
_________________________________________
很简单的动规方程: F[i]:=max(F[j]+a*(s[i]-s[j])^2+b*(s[i]-s[j])+c)
用斜率式优化:
原方程展开: F[i]:=max(F[j]+a*s[i]^2-2*a*s[i]*s[j]+a*s[j]^2+b*s[i]-b*s[j]+c)
设g(i,j)为 F[i] 的一个决策
则 g(i,j)-g(i,k)=f[j]+a*s[j]^2-(f[k]+a*s[k]^2)-(b+a*s[i]^2)*(s[j]-s[k])
当 决策j 优于决策 k时 g(i,j)-g(i,k)>0
设 y[i]=f[i]+a*s[i]^2 , x[i]=s[i]
所以可化简为 (y[k]-y[j])/(x[i]-x[j])>b+a*s[i]^2
因为 a<0 所以 b+a*s[i]^2 单调递减。
_________________________________________
ProgramStone; var i,j,head,tail,a,b,c,n:longint; s,f,cons,sq,que:array[0..1000001]ofint64; function delhead(i,j,k:longint):boolean; begin if cons[i]*(s[j]-s[k])>sq[j]-sq[k] then exit(true) else exit(false); end; functiondeltail(i,j,k:longint):boolean; begin if(sq[i]-sq[j])*(s[j]-s[k])>(sq[j]-sq[k])*(s[i]-s[j]) then exit(true) else exit(false); end; functionmax(a,b:int64):int64; begin ifa>b thenmax:=a elsemax:=b; end; Begin readln(n); readln(a,b,c); fori:=1ton do read(s[i]); fori:=2ton do inc(s[i],s[i-1]); head:=1;tail:=0; fori:=1ton do begin cons[i]:=b+2*a*s[i]; while(tail>head)and(delhead(i,que[head],que[head+1])) do inc(head); j:=que[head]; f[i]:=max(a*sqr(s[i])+b*s[i]+c,f[j]+a*sqr(s[i]-s[j])+b*(s[i]-s[j])+c); sq[i]:=f[i]+a*sqr(s[i]); while(tail>head)and(deltail(i,que[tail],que[tail-1])) dodec(tail); inc(tail); que[tail]:=i; end; writeln(f ); end.
相关文章推荐
- Windows编程基础
- 是否素数
- MySql “Row size too large (> 8126)”
- Elecator
- Qt之QHeaderView自定义排序(终极版)
- Qt之QHeaderView自定义排序(终极版)
- jps命令(Java Virtual Machine Process Status Tool)
- OC中的字符串的一些操作
- Nginx配置SSL证书部署HTTPS网站
- 24. Swap Nodes in Pairs
- 在Xcode 中如何打包测试版 给测试工程师使用
- MailCore2的使用心得
- 对于IE6版本图片透明。
- 基于Python Django技术构建web系统实践
- HDU 5405(树链剖分)
- Textview的格式化显示
- 初学Linux
- java 多线程锁synchronized
- [iOS]编写高质量的Objective-C代码
- linux shell for循环解决递归循环目录结构