POJ3612:Telephone Wire
一道很棒的DP题目。
裸的DP方程很好搞:
$f[i][j]=min \{ f[i-1][k]+ C \times |k-j| +(k-a[i])^2 \}$
这个复杂度显然无法承受,考虑优化。
这个东西肯定不满足单调性和斜率上的优化条件,所以考虑分解这个式子。
$f[i][j]=min \{ f[i-1][k]+ C \times |j-k| +(k-a[i])^2 \}$
$f[i][j]=\begin{equation} \begin{cases} (j-a[i])^2+j \times C+min \{ f[i-1][k]-k\times C \} (k \leq j) \\ (j-a[i])^2-j \times C+min \{ f[i-1][k]+k\times C\} (j < k) \end{cases} \end{equation} $
然后把右边那两部分预处理一下就行了
//POJ 3612
//by Cydiater
//2016.10.8
#include <iostream>
#include <cstdlib>
#include <queue>
#include <map>
#include <cstdio>
#include <iomanip>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
const int MAXN=1e6+5;
const int oo=0x3f3f3f3f;
inline int read(){
char ch=getchar();int x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int N,C,height[MAXN],high[MAXN],f[MAXN],low[MAXN],ans=oo;
namespace solution{
void init(){
N=read();C=read();
up(i,1,N)height[i]=read();
}
void slove(){
memset(high,10,sizeof(high));
memset(low,10,sizeof(low));
up(i,1,100)f[i]=height[1]<=i?(i-height[1])*(i-height[1]):oo;
up(i,2,N){
int tmp=oo;
down(j,100,1)low[j]=tmp=min(tmp,f[j]+j*C);tmp=oo;
up(j,1,100)high[j]=tmp=min(tmp,f[j]-j*C);
up(j,1,100)f[j]=j<height[i]?oo:((j-height[i])*(j-height[i])+min(low[j]-j*C,high[j]+j*C));
}
up(i,1,100)ans=min(ans,f[i]);
}
void output(){
cout<<ans<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
slove();
output();
return 0;
}
POJ3612:Telephone Wire的更多相关文章
- [POJ3612] Telephone Wire(暴力dp+剪枝)
[POJ3612] Telephone Wire(暴力dp+剪枝) 题面 有N根电线杆,初始高度为h[i],要给相邻的两根连线.可以选择拔高其中一部分电线杆,把一根电线杆拔高\(\Delta H\)的 ...
- [USACO07NOV]电话线Telephone Wire
[USACO07NOV]电话线Telephone Wire 时间限制: 1 Sec 内存限制: 128 MB 题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N &l ...
- 【USACO07NOV】电话线Telephone Wire
题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N <= 100,000)根电线杆上, 第 i 根电线杆的高度为 height_i 米(1 <= heigh ...
- BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP
BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是 ...
- P2885 [USACO07NOV]电话线Telephone Wire
P2885 [USACO07NOV]电话线Telephone Wire 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话 ...
- 【动态规划】bzoj1705: [Usaco2007 Nov]Telephone Wire 架设电话线
可能是一类dp的通用优化 Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设 ...
- bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
1705: [Usaco2007 Nov]Telephone Wire 架设电话线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 441 Solved: ...
- DP+滚动数组 || [Usaco2007 Nov]Telephone Wire 架设电话线 || BZOJ 1705 || Luogu P2885
本来是懒得写题解的…想想还是要勤发题解和学习笔记…然后就滚过来写题解了. 题面:[USACO07NOV]电话线Telephone Wire 题解: F[ i ][ j ] 表示前 i 根电线杆,第 i ...
- [USACO 07NOV]电话线Telephone Wire
题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...
随机推荐
- .Net分布式异常报警系统-简介
系统简介 分布式异常报警系统就是收集系统运行过程中产生的未处理异常,检查系统运行的状态,并将异常信息统一发送到服务端,由服务端将信息通知到相关的责任人. 问题 我们在项目开发中可能遇到以下几个问题: ...
- 项目规范性检测工具Lint
项目规范性检测工具lint.bat 一.Lint基本概念介绍 Android Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通过它对Android工程源代码进行扫描和检查,可发 ...
- BGP路由协议详解(完整篇)
原文链接:http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上个月我写一篇关于BGP协议的博文,曾许诺过要完善这个文档,但 ...
- hdu5481 Desiderium
链接 Desiderium 题意 给定n条线段,从中选取若干条,共有2n种选法(因为每一条线段有两种方法:选或者不选). 每一种选法都对应一个长度,也就是所选线段的并集长度. 求这2n种选法长度之和. ...
- PHP-- 获取http请求头信息
看官方文档: http://php.net/manual/zh/function.apache-request-headers.php http://php.net/manual/zh/functio ...
- VS2015中GLAUX库的链接问题
最近学习OpenGL,照着例子写了个程序,用到了GLAUX库. #include <gl\glaux.h> #pragma comment(lib, "glaux") ...
- python 登陆接口
#!/usr/bin/env pythonimport sysname = ''pw=''name_num = 0pw_num = 0#black_list = []with open('a.txt' ...
- 天朝git的使用
开源中国社区 官方网站 https://git.oschina.net/ 开源中国社区成立于2008年8月,其目的是为中国的IT技术人员提供一个全面的.快捷更新的用来检索开源软件以及交流使用开源经验的 ...
- 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP
这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...
- mssql-异常value '0000-00-00' can not be represented as java.sql.Date
Mysql开发中采用ResultSet取值時,不管是才用getString()还是用getDate(),或者getObject,均会拋出如题所述异常.查阅Mysql官方Bug咨询: 是因为日期型(Da ...