题目描述

最近,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;
}

转载于:https://www.cnblogs.com/GXZlegend/p/6306232.html

【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 MB Submit: 441  Solved ...

  2. bzoj 1705: [Usaco2007 Nov]Telephone Wire 架设电话线【dp】

    i的初始化写成2了于是成功查错2h--怕不是个傻子 设f[i][j]为第i根高为j,转移是 \[ f[i][j]=min(f[i-1][k]+abs(k-j)*c+(j-h[i])^2)(j>= ...

  3. POJ3612 洛谷P2885 [USACO07Nov] Telephone Wire 架设电话线 dp

    题目链接:洛谷 POJ 题目描述 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的 N ( ...

  4. [BZOJ] 1614: [Usaco2007 Jan]Telephone Lines架设电话线

    1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1806  Solve ...

  5. bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线(二分+SPFA)

    1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1761  Solve ...

  6. [BZOJ1614][Usaco2007 Jan]Telephone Lines架设电话线

    [Usaco2007 Jan]Telephone Lines架设电话线 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算 ...

  7. [Usaco2007 Jan]Telephone Lines架设电话线

    题目描述 FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用.FJ的农场周围分布着N(1<=N<=1,000)根 ...

  8. BZOJ——1614: [Usaco2007 Jan]Telephone Lines架设电话线

    Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1930  Solved: 823 [Submit][Status][Discuss] Descripti ...

  9. 【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线

    对于二分出的答案x而言,验证答案等价于将所有边权>x的边赋成1,否则赋成0,然后判断从1到n的最短路是否<=K. #include<cstdio> #include<cs ...

最新文章

  1. 干货 | 基于贝叶斯推断的分类模型 机器学习你会遇到的“坑”
  2. 冲向大牛之安卓---2014.11月面试经常碰到的一些问题
  3. 01.神经网络和深度学习 W4.深层神经网络
  4. LeetCode MySQL 1083. 销售分析 II
  5. java pdf 类库_有哪些可以给pdf加水印,java第三方开源类库?
  6. 如何在MVC中下载模板和上传word文件
  7. Hive、Spark优化案例
  8. cruise软件模型,cruise增程混动仿真模型,功率跟随控制策略,Cruise混动仿真模型,串联混动汽车动力性经济性仿真
  9. Excel VBA宏
  10. 问题: 在Multisim中的 Tools»Show Breadboard,我找不到面包板视图的选项。
  11. 一生要知道的100幅世界名画
  12. 信息化建设中的IT规划精要
  13. MFSPV: A Multi-Factor Secured and Lightweight Privacy-Preserving Authentication Schem
  14. delphi去掉字段前后的引号_delphi 单引号在字符串中使用方法
  15. html布局直接填充,css实现自动填充布局
  16. VC中自定义IE浏览器
  17. [Swift]代码触发UIButton的点击事件
  18. 157 亿美元!Salesforce收购Tableau,全球最大CRM巨头与大数据平台在一起了!
  19. c语言或运算怎么没起作用,C语言学不会? 这样学习, 才有效果!
  20. 听哈佛商学院教授讲:如何建立信任

热门文章

  1. oracle查询结果存入临时表,Oracle查询问题引发临时表使用
  2. python 初始化一个4维向量_看图学NumPy:掌握n维数组基础知识点,看这一篇就够了...
  3. java开发中推荐的防御sql注入方法_不推荐的防御sql注入方式
  4. 基于随机梯度下降法的手写数字识别、epoch是什么、python实现
  5. 工程用计算机是什么样子的,【2人回答】学软件工程的应该买什么样的处理器电脑?-3D溜溜网...
  6. 地图自定义图标_如何在H5里添加地图导航?这份教程请收藏!
  7. python print 如何加锁_python中给程序加锁之fcntl模块的使用
  8. java final 变量只读_java final的使用总结
  9. 基于jsp+mysql+mybatis+Spring boot简单学生成绩信息管理系统
  10. mysql取消操作系统_Linux下的MySQL简单操作(服务启动与关闭、启动与关闭、查看版本)...