话说这题很久以前就写过,然后好像一直忘了写题解……

以前看这道题还觉得挺难的,现在觉得好水

首先朴素的想法肯定是动归

f[i,j]表示到处理到第i根电线,最终高度为j的最小花费

f[i,j]:=min(f[i-1,k]+sqr(h[i]-j)+abs(j-k)*c) (h[i]<=j<=max) max为原来所有电线最高的高度

但这个会超时,我们就要想办法优化;

考虑这样一个方程式f[i,j]:=min(f[i-1,k]+sqr(h[i]-j)+(j-k)*c);

我们很容易用O(max)的时间完成转移(好像之前有过例子);

但这个方程式多了一个绝对值,根据数学上的思想,我们就去绝对值讨论呗;

容易整理得到

f[i,j]=min(min(f[i-1,k]-k*c+j*c) j>=k, min(f[i-1,k]+k*c-j*c) j<=k)+sqr(h[i]-j)

这样不难想到,令

tal[j]=min(f[i-1,k]+k*c)  k∈[j,max];

sho[j]=min(f[i-1,k]-k*c)  k∈[h[i-1],j]

tal[j]表示上一根电线杆状态高度大于当前电线杆高度j高的花费中的最小值

sho[j]表示上一根电线杆状态高度小于当前电线杆高度j高的花费中的最小值

然后弄弄就出来了

 const hmax=;
      inf=;
var h:array[..] of longint;
    sho,tal:array[..] of longint;
    f:array[..,..] of longint;
    i,k1,k2,n,m,j,c,ans:longint;
function min(a,b:longint):longint;
  begin
    if a>b then exit(b) else exit(a);
  end; begin
  readln(n,c);
  for i:= to n do
  begin
    readln(h[i]);
    if h[i]>m then m:=h[i];
  end;
  h[n+]:=h[i];
  k1:=;
  k2:=;
  for i:=h[] to m do
    f[,i]:=sqr(i-h[]);
  for i:= to n do
  begin
    k1:=k1 xor ;
    k2:=k2 xor ;
    for j:= to m do
    begin
      tal[j]:=inf;
      sho[j]:=inf;
      f[k2,j]:=inf;
    end;
    tal[m]:=f[k1,m]+c*m;
    for j:=m- downto h[i-] do
      tal[j]:=min(tal[j+],f[k1,j]+c*j);
    sho[h[i-]]:=f[k1,h[i-]]-c*h[i-];
    for j:=h[i-]+ to m do
      sho[j]:=min(sho[j-],f[k1,j]-c*j);
    for j:=h[i] to m do
      if j<h[i-] then
        f[k2,j]:=min(f[k2,j],tal[h[i-]]-c*j+sqr(j-h[i]))  //注意细节,这时候上一根电线杆不存在比这根矮的状态
      else
        f[k2,j]:=min(f[k2,j],min(tal[j]-c*j,sho[j]+c*j)+sqr(j-h[i]));
  end;
  ans:=inf;
  for i:=h[n] to m do
    ans:=min(ans,f[k2,i]);
  writeln(ans);
end.

bzoj1705的更多相关文章

  1. BZOJ-1705 Longge的问题 一维GCD SUM 乱搞+质因数分解+...

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 1871 Solved: 1172 [Submit][ ...

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

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

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

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

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

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

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

  6. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

  7. bzoj Usaco补完计划(优先级 Gold>Silver>资格赛)

    听说KPM初二暑假就补完了啊%%% 先刷Gold再刷Silver(因为目测没那么多时间刷Silver,方便以后TJ2333(雾 按AC数降序刷 ---------------------------- ...

随机推荐

  1. C++ #pragma 预处理指令

    #pragma 预编译指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征 ...

  2. mysql数据库之索引和分析索引

    分析查询语句是否用到了索引 explain sql语句\G //根据返回的信息,我们可知,该sql语句是否使用索引,从多少记录中取出,可以看到排序的方式. 主要是看 key 实际用到的索引 rows ...

  3. linux中 ECShop的文件不能写

    解决办法: 1.开放权限 使用命令:chmod -R 777 文件路径 2.关闭SELinux 使用命令:setenforce 0

  4. jquery checkbox 选中 全选 插件

    checkbox  选中 全选 在项目中经常用到,但是不同的程序员写出的东西各有差异,在此整合了jquery checkbox插件,用起来很方便,也总结了我们项目中通常会出现问题的地方,一行代码搞定. ...

  5. iPad知识点记录

    这两天玩了玩虚拟机安装Mac OS系统.iPad1的越狱以及利用iTunes将iPad2的系统升级到iOS8.1,这里将一些参考资源以及关键点记录一下. 一.虚拟机安装Mac OS 首先你的系统要能够 ...

  6. Leetcode按Tag刷题

    按照Leetcode的Tag来刷题,从easy到hard刷题 关于如何让Leetcode按难易程度排序,可按以下步骤: 1. 进入Leetcode后,点击code 2.点击code后,可查看所有题目, ...

  7. PHP中0、空、null和false的总结

    php中很多人还不懂php中 0 , '' , null 和 false 之间的区别,这些区别有时会影响到数据判断的正确性和安全性,给程序的测试运行造成很多麻烦.另外在面试题中也会遇到这些问题,如下: ...

  8. WPF中Application.Current的使用

    WPF程序对应一个Application对象,当前的Application对象可以通过Application.Current获取,通过获取到的Application对象,我们可以做以下的事情: App ...

  9. jquery set selected for select element

    //1$("#Provider_" + counter + " option[value=" + FormData.ID + "]").at ...

  10. python 程序列表

    用 python  通过读取注册表来获取机器安装的程序列表,包括,软件名称,版本号,安装日期等 # -*- coding: UTF8 -*-import _winregimport osimport ...