【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp
题目描述
最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线。 新的电话线架设在已有的N(2 <= N <= 100,000)根电话线杆上, 第i根电话线杆的高度为height_i米(1 <= height_i <= 100)。 电话线总是从一根电话线杆的顶端被引到相邻的那根的顶端 如果这两根电话线杆的高度不同,那么FJ就必须为此支付 C*电话线杆高度差(1 <= C <= 100)的费用。当然,你不能移动电话线杆, 只能按原有的顺序在相邻杆间架设电话线。Farmer John认为 加高某些电话线杆能减少架设电话线的总花费,尽管这项工作也需要支出一定的费用。 更准确地,如果他把一根电话线杆加高X米的话,他得为此付出X^2的费用。 请你帮Farmer John计算一下,如果合理地进行这两种工作,他最少要在这个电话线改造工程上花多少钱。
输入
第1行: 2个用空格隔开的整数:N和C
第2..N+1行: 第i+1行仅有一个整数:height_i
输出
第1行: 输出Farmer John完成电话线改造工程所需要的最小花费
样例输入
5 2
2
3
5
1
4
样例输出
15
题解
dp+优化
每个电线杆加高之后的最高高度肯定不超过高度最大值maxh,这是显然的。
首先有最基本的思路:
f[i][j]表示第i个柱子高度为j时的最小花费。
那么就有f[i][j]=(j-h[i])2+min(f[i-1][k]+c*abs(k-j)),k<=maxh
这样时间复杂度是O(nh2),会超时,肯定要优化。
怎么优化呢?可以把绝对值拆开,于是状态转移方程变为
f[i][j]=(j-h[i])2+min(f[i-1][k]-c*k)+c*j,k<=j
(j-h[i])2+min(f[i-1][k]+c*k)-c*j,k>=j
那么我们只要分别维护f[i-1][k]-c*k,k<=j和f[i-1][k]+c*k,k>=j的最小值即可,可以递推求出。
设min1[i][j]为k<=j时f[i][k]-c*k的最小值,min2[i][j]为k>=j时f[i][k]+c*k的最小值。
那么就有min1[i][j]=min(min1[i][j-1],f[i][j]-c*j)
min2[i][j]=min(min2[i][j+1],f[i][j]+c*j)
以及f[i][j]=(j-h[i])2+min(min1[i-1][j]+c*j,min2[i-1][j]-c*j)。
注意公式中有的是i有的是i-1,不要弄混。
于是时间复杂度被优化到了O(nh),解决了时间问题。
然而题目空间要求是64MB,这样开二维数组会MLE。
所以我使用了滚动数组黑科技,应该不难理解,注意细节。
听说少开一个二维数组好像也能过,没试过,反正滚动数组应该是最好的做法了吧。
还有柱子高度不能降低,所以注意一下循环起始点和终止点。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int f[102] , h[100002] , min1[102] , min2[102];
int main()
{
int n , c , m = 0 , i , j , ans = 0x3f3f3f3f;
scanf("%d%d" , &n , &c);
for(i = 1 ; i <= n ; i ++ )
scanf("%d" , &h[i]) , m = max(m , h[i]);
memset(f , 0x3f , sizeof(f));
for(i = h[1] ; i <= m ; i ++ )
f[i] = (i - h[1]) * (i - h[1]);
for(i = 2 ; i <= n ; i ++ )
{
memset(min1 , 0x3f , sizeof(min1));
memset(min2 , 0x3f , sizeof(min2));
for(j = h[i - 1] ; j <= m ; j ++ )
min1[j] = min(min1[j - 1] , f[j] - c * j);
for(j = m ; j >= 1 ; j -- )
min2[j] = min(min2[j + 1] , j >= h[i - 1] ? f[j] + c * j : 0x3f3f3f3f);
for(j = h[i] ; j <= m ; j ++ )
f[j] = (j - h[i]) * (j - h[i]) + min(min1[j] + c * j , min2[j] - c * j);
}
for(i = h[n] ; i <= m ; i ++ )
ans = min(ans , f[i]);
printf("%d\n" , ans);
return 0;
}
【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp的更多相关文章
- bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
1705: [Usaco2007 Nov]Telephone Wire 架设电话线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 441 Solved: ...
- 【动态规划】bzoj1705: [Usaco2007 Nov]Telephone Wire 架设电话线
可能是一类dp的通用优化 Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设 ...
- bzoj 1705: [Usaco2007 Nov]Telephone Wire 架设电话线——dp
Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...
- BZOJ 1705: [Usaco2007 Nov]Telephone Wire 架设电话线 DP + 优化 + 推导
Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...
- [bzoj1705] [Usaco2007 Nov]Telephone Wire 架设电话线
正常DP.. f[i][j]表示前i个电线杆,把第i个电线杆高度改为j的最少总费用.设原来电线杆高度为h[] f[i][j]=min{ f[i-1][k]+C*|j-k|+(j-h[i])^2,(k& ...
- BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP
BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是 ...
- DP+滚动数组 || [Usaco2007 Nov]Telephone Wire 架设电话线 || BZOJ 1705 || Luogu P2885
本来是懒得写题解的…想想还是要勤发题解和学习笔记…然后就滚过来写题解了. 题面:[USACO07NOV]电话线Telephone Wire 题解: F[ i ][ j ] 表示前 i 根电线杆,第 i ...
- 【BZOJ】1705: [Usaco2007 Nov]Telephone Wire 架设电话线
[题意]给定一排n根杆高度hi,一个常数C,杆升高x的代价为x^2,相邻两杆之间架设电话线代价为高度差*C,求总代价最小. [算法]DP+辅助数组优化 [题解]令f[i][j]表示第i根杆高度为j的最 ...
- bzoj 1705;poj 3612:[Usaco2007 Nov]Telephone Wire 架设电话线
Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...
随机推荐
- c++中string (MFC)
题目:UVALive - 6439 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid= ...
- BZOJ2730_矿场搭建_KEY
题目传送门 这道题用Tarjan求出点-双连通分量,对联通块做一些玄学操作. 细节很多,不说了看code. code: /*************************************** ...
- BZOJ1968_COMMON约数研究_KEY
题目传送门 BZOJ水题,for i=1~N,答案加上N/i即可 ANS=∑N/i(i∈{1~N}) code: /****************************************** ...
- 成都Uber优步司机奖励政策(1月28日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- clr via c#读书笔记五:常量和字段
1.常量是值从不变化的符号.只能定义编译器识别的基元类型的常量.如:Boolean,Char,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,Single,Dou ...
- Win10 远程服务器版
朋友的电脑刚装了1803版的Win10,然后他用KMS_VL_ALL6.9激活了一下,竟然变成了一个奇怪的版本:“远程服务器版”!第一次见这玩意,还真稀罕.帮他研究了一下,发现KMS_VL_ALL在激 ...
- UPA深度性能报告解读
WeTest 导读 UPA作为腾讯WeTest与Unity官方联合打造的客户端性能分析工具,为开发者提供了极大的便利和效能提升.产出的分析报告内容详尽,但您是否真的读懂了报告?是否了解每项数据的含义? ...
- nginx支持php配置
location / { root /wwwroot/phptest; index index.html index.htm index.php; } location ~ \.(php|php5)$ ...
- Http的请求和响应
请求有客户端发起:可分为4个部分,请求方法(Requestmethod).请求的网址(Request URL).请求头(Request Headers).请求体(Request Body) 1.请求方 ...
- HDU - 6409:没有兄弟的舞会(数学+思维)
链接:HDU - 6409:没有兄弟的舞会 题意: 题解: 求出最大的 l[i] 的最大值 L 和 r[i] 的最大值 R,那么 h 一定在 [L, R] 中.枚举每一个最大值,那么每一个区间的对于答 ...