Description

最近,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计算一下,如果合理地进行这两种工作,他最少要在这个电话线改造工程上花多少钱。

Input

* 第1行: 2个用空格隔开的整数:N和C

* 第2..N+1行: 第i+1行仅有一个整数:height_i

Output

* 第1行: 输出Farmer John完成电话线改造工程所需要的最小花费

题解:

首先,加高后的最高高度一定不大于当前最高高度.

$f[i][j]$ 表示第 $i$ 个柱子高度为 $j$ 时的最小花费.
$f[i][j]=(j-h[i])^{2}+min(f[i-1][k]+c\times \left | k-j \right |)$
绝对值符号有些不好处理,再把转移方程拆一下:
$f[i][j]=(j-h[i])^{2}+min(f[i-1][k]-c\times k)$ ,$k<=j$
$f[i][j]=(j-h[i])^{2}+min(f[i-1][k]+c\times k)$, $k>=j$
不难看出,对于 $f[i][j]$ 来说, $(j-h[i])^{2}$ 是固定的,直接算即可.
我们设 $min1[i][j]$ 为 $k<=j$ 时 $f[i][k]-c\times k$ 的最小值.
不难得出 : $min1[i][j]=min(min1[i][j-1], f[i][j]-c\times j)$
而 $f[i][j]=(j-h[i])^{2}+min1[i-1][j]$.
于是,我们用下标为 $i-1$ 的答案来更新当前下标为 $i$ 的答案,再用当前的 $f[i][j]$ 来更新下标为 $i$ 的 $min1[i][j]$ 即可,每次转移时
$O(1)$ 的。
  
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define Max(a,b) (a=a>b?a:b)
#define Min(a,b) (a=a<b?a:b)
using namespace std;
int f[103],h[100003],min1[103],min2[103];
int main()
{
// setIO("input");
int n,c,maxv=0;
scanf("%d%d",&n,&c);
for(int i=1;i<=n;++i)
scanf("%d",&h[i]),Max(maxv,h[i]);
memset(f,0x3f,sizeof(f));
for(int i=h[1];i<=maxv;++i) f[i]=(i-h[1])*(i-h[1]);
for(int i=2;i<=n;++i)
{
memset(min1,0x3f,sizeof(min1));
memset(min2,0x3f,sizeof(min2));
for(int j=h[i-1];j<=maxv;++j)
min1[j]=min(min1[j-1],f[j]-c*j);
for(int j=maxv;j>=1;--j)
min2[j]=min(min2[j+1],j>=h[i-1]?f[j]+c*j:0x3f3f3f3f);
for(int j=h[i];j<=maxv;++j)
f[j]=(j-h[i])*(j-h[i])+min(min1[j]+c*j,min2[j]-c*j);
}
int ans=0x3f3f3f3f;
for(int i=h[n];i<=maxv;++i) ans=min(ans,f[i]);
printf("%d\n",ans);
return 0;
}

  

BZOJ 1705: [Usaco2007 Nov]Telephone Wire 架设电话线 DP + 优化 + 推导的更多相关文章

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

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

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

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

  3. 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>= ...

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

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

  5. 【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp

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

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

    传送门 显然 $dp$,首先设 $f[i][j]$ 表示当前考虑到第 $i$ 个电线杆,高度为 $j$ 时的最小代价 那么有转移 $f[i][j]=f[i-1][k]+cost+C(j-k)$,其中 ...

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

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

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

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

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

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

随机推荐

  1. kendo grid create

    这种自定义的create中的函数,这个data的行为是在发送到后端之前执行的 //{ // url: "/admgr/AdUserAuthorityAdd", // dataTyp ...

  2. noi.openjudge——2971 抓住那头牛

    http://noi.openjudge.cn/ch0205/2971/ 总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫 ...

  3. 一起talk C栗子吧(第七十七回:C语言实例--DIY ls命令续)

    各位看官们,大家好.上一回中咱们说的是DIY cat命令的样例.这一回咱们说的样例是:DIY ls命令续. 闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前面的章回中DIY过ls命令.时间 ...

  4. android 用java代码设置布局、视图View的宽度/高度或自适应

    在achat项目中,对话内容的长宽设置为自适应.可是假设文本内容太多,则宽度几乎相同布满,若自己说的和对方说的都非常多内容.则满屏都是文字.则不easy分辨出是来自别人说的还是自己说的.那么须要对本身 ...

  5. discuz新的单点论坛(不依赖UCenter)

    discuz 本身提供UCENTER用户中心能够实现单点登录. 可是其它应用要单点登录到discuz还是存在若干问题: 须要2次激活.可能造成server无响应,论坛显示的最新注冊用户无法同步更新,官 ...

  6. 从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法

    接着上一章节.我们来讨论一下get方法. 1.还是利用上一章节的图 下图引用自:http://www.admin10000.com/document/3322.html 我们简单说一下步骤.就是通过h ...

  7. WPF学习笔记——为BUTTON添加背景图片

    首先要肯定,代码: <Style x:Key="UserItemButton" TargetType="Button"> <Setter Pr ...

  8. C语言/C++中如何产生随机数

    C语言/C++中如何产生随机数 作者: 字体:[增加 减小] 类型:转载 时间:2013-10-14我要评论 这里要用到的是rand()函数, srand()函数,和time()函数.需要说明的是,i ...

  9. TensorFlow Lite demo——就是为嵌入式设备而存在的,底层调用NDK神经网络API,注意其使用的tf model需要转换下,同时提供java和C++ API,无法使用tflite的见后

    Introduction to TensorFlow Lite TensorFlow Lite is TensorFlow’s lightweight solution for mobile and ...

  10. WPF:通过Window.DataContext实现窗口间传值

    通过Window.DataContext实现窗口之间的传值,特别是跨窗口控件的联动,具有无可比拟的优势.实现方法如下: 1.  MainWindow.xaml,在Window.DataContext中 ...