题目描述

最近,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的更多相关文章

  1. bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)

    1705: [Usaco2007 Nov]Telephone Wire 架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 441  Solved: ...

  2. 【动态规划】bzoj1705: [Usaco2007 Nov]Telephone Wire 架设电话线

    可能是一类dp的通用优化 Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设 ...

  3. bzoj 1705: [Usaco2007 Nov]Telephone Wire 架设电话线——dp

    Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...

  4. BZOJ 1705: [Usaco2007 Nov]Telephone Wire 架设电话线 DP + 优化 + 推导

    Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...

  5. [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& ...

  6. BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP

    BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是 ...

  7. DP+滚动数组 || [Usaco2007 Nov]Telephone Wire 架设电话线 || BZOJ 1705 || Luogu P2885

    本来是懒得写题解的…想想还是要勤发题解和学习笔记…然后就滚过来写题解了. 题面:[USACO07NOV]电话线Telephone Wire 题解: F[ i ][ j ] 表示前 i 根电线杆,第 i ...

  8. 【BZOJ】1705: [Usaco2007 Nov]Telephone Wire 架设电话线

    [题意]给定一排n根杆高度hi,一个常数C,杆升高x的代价为x^2,相邻两杆之间架设电话线代价为高度差*C,求总代价最小. [算法]DP+辅助数组优化 [题解]令f[i][j]表示第i根杆高度为j的最 ...

  9. bzoj 1705;poj 3612:[Usaco2007 Nov]Telephone Wire 架设电话线

    Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...

随机推荐

  1. 20145234黄斐《Java程序设计》第七周学习总结

    教材学习内容总结 Lambda语法 Lambda去可以重复,符合DRY原则,而且Lambda表达式可读性更好,操作更简单 匿名类型最大的问题就在于其冗余的语法,lambda表达式是匿名方法,它提供了轻 ...

  2. 北京Uber优步司机奖励政策(12月14日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. linux初学体会

    第一篇随笔,其实是为了写作业,可是老师的要求是对的,其实自己在配环境和做作业的时候也会把遇到的问题的解决方法记录下来,以便以后查找方便.这次借此将那些内容放在这里,也跟大家一起分享下. 上周六算是第二 ...

  4. Ubuntu目录与权限

    Ubuntu目录 / /bin /sbin /boot /etc /mnt /home d :directory - :file b :block  磁盘以块进行 l :link Ubuntu权限 U ...

  5. 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域

    此篇文章是对上一篇文章(http://www.ifiero.com/index.php/archives/611)的进一步补充,主要说明如何适配Apple的最新三款手机iPhoneXs.iPhoneX ...

  6. java扫描控制台输入

    由于因最近练习算法的需要,加上API文档中翻译的太过模糊,做了一些小测试,算是武断的记下一些个人结论. Scanner cin = new Scanner(System.in); 对于cin.next ...

  7. [CH0304]IncDec Sequence

    和NOIP2018DAY1T1类似的题目,但思维难度高多了. 这题既可以抬高路面,也可以降低路面,而且目标平面不确定,就难起来了. 但是两道题的基本思路几乎一样,同样我们将 2~n 的高度差分,1之所 ...

  8. HDU 3467 Song of the Siren(圆交)

    Problem Description In the unimaginable popular DotA game, a hero Naga Siren, also known as Slithice ...

  9. POJ 3714 Raid(计算几何の最近点对)

    Description After successive failures in the battles against the Union, the Empire retreated to its ...

  10. “Hello world!”团队—选题展示

    本次选题展示内容: 一.视频展示 链接:http://v.youku.com/v_show/id_XMzA5Mzk5NjYwOA==.html?sharefrom=iphone 视频截图链接:http ...