题目描述

Farmer John's cows are getting restless about their poor telephone service; they want FJ to replace the old telephone wire with new, more efficient wire. The new wiring will utilize $N (2 ≤ N ≤ 100,000) $already-installed telephone poles, each with some heighti meters \((1 ≤ height_i ≤ 100)\). The new wire will connect the tops of each pair of adjacent poles and will incur a penalty cost\(C_×\) the two poles' height difference for each section of wire where the poles are of different heights \((1 ≤ C ≤ 100)\). The poles, of course, are in a certain sequence and can not be moved.

Farmer John figures that if he makes some poles taller he can reduce his penalties, though with some other additional cost. He can add an integer X number of meters to a pole at a cost of \(X_2\).

Help Farmer John determine the cheapest combination of growing pole heights and connecting wire so that the cows can get their new and improved service.

输入格式

* Line 1: Two space-separated integers: N and C

* Lines \(2..N+1\): Line i+1 contains a single integer: \(height_i\)

输出格式

* Line 1: The minimum total amount of money that it will cost Farmer John to attach the new telephone wire.

样例 #1

样例输入 #1

5 2
2
3
5
1
4

样例输出 #1

15

首先打出暴力dp,记录\(dp_{i,j}\)为前面\(i\)棵树且第\(i\)棵树的高度为\(j\)的最小代价。

\(dp_{i,k}=min(\forall h_i\le j\le 100,dp_{i-1,j}+(k-h[i])^2+|k-j|*c)\)

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,c,h[N],dp[N][105],ans=2e9;
int main()
{
memset(dp,0x3f,sizeof(dp));
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
scanf("%d",h+i);
for(int i=h[1];i<=100;i++)
dp[1][i]=(i-h[1])*(i-h[1]);
for(int i=2;i<=n;i++)
for(int k=h[i];k<=100;k++)
for(int j=0;j<=100;j++)
dp[i][k]=min(dp[i][k],dp[i-1][j]+(k-h[i])*(k-h[i])+abs(k-j)*c);
for(int i=0;i<=100;i++)
ans=min(ans,dp[n][i]);
printf("%d",ans);
return 0;
}

复杂度明显不过关,但是开个O2可以通过洛谷数据

开始考虑正解,在式子中,\((k-h_i)^2\)可以提到外面,同时可以把绝对值的两种情况分开考虑,要考虑的式子就是

\(dp_{i-1,j}+k*c-j*c(k\ge j)\)

和\(dp_{i-1,j}+j*c-k*c(k<j)\)

k*c也可以提到外面,然后对\(dp_{i-1,j}-j*c\)维护前缀最大值,对\(dp_{i-1,j}+j*c\)维护后缀最大值,就可以实现O(1)转移,可以通过此题。

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,c,h[N],dp[N][105],ans=2e9,s[N][105],t[N][105];
int main()
{
memset(dp,0x3f,sizeof(dp));
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
scanf("%d",h+i);
for(int i=h[1];i<=100;i++)
dp[1][i]=(i-h[1])*(i-h[1]);
s[1][0]=dp[1][0],t[1][100]=dp[1][100]+100*c;
for(int j=1;j<=100;j++)
s[1][j]=min(s[1][j-1],dp[1][j]-j*c);
for(int j=99;j>=0;j--)
t[1][j]=min(t[1][j+1],dp[1][j]+j*c);
for(int i=2;i<=n;i++)
{
for(int k=h[i];k<=100;k++)
dp[i][k]=min(s[i-1][k]+k*c,t[i-1][k]-k*c)+(k-h[i])*(k-h[i]);
s[i][0]=dp[i][0],t[i][100]=dp[i][100]+100*c;
for(int j=1;j<=100;j++)
s[i][j]=min(s[i][j-1],dp[i][j]-j*c);
for(int j=99;j>=0;j--)
t[i][j]=min(t[i][j+1],dp[i][j]+j*c);
}
for(int i=0;i<=100;i++)
ans=min(ans,dp[n][i]);
printf("%d",ans);
return 0;
}

[USACO2007NOVG] Telephone Wire G的更多相关文章

  1. [USACO07NOV]电话线Telephone Wire

    [USACO07NOV]电话线Telephone Wire 时间限制: 1 Sec  内存限制: 128 MB 题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N &l ...

  2. 【USACO07NOV】电话线Telephone Wire

    题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N <= 100,000)根电线杆上, 第 i 根电线杆的高度为 height_i 米(1 <= heigh ...

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

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

  4. P2885 [USACO07NOV]电话线Telephone Wire

    P2885 [USACO07NOV]电话线Telephone Wire 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话 ...

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

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

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

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

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

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

  8. [POJ3612] Telephone Wire(暴力dp+剪枝)

    [POJ3612] Telephone Wire(暴力dp+剪枝) 题面 有N根电线杆,初始高度为h[i],要给相邻的两根连线.可以选择拔高其中一部分电线杆,把一根电线杆拔高\(\Delta H\)的 ...

  9. [USACO 07NOV]电话线Telephone Wire

    题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...

  10. 【POJ3612】【USACO 2007 Nov Gold】 1.Telephone Wire 动态调节

    意甲冠军: 一些树高给出.行一种操作:把某棵树增高h,花费为h*h. 操作完毕后连线,两棵树间花费为高度差*定值c. 求两种花费加和最小值. 题解: 跟NOIP2014 D1T3非常像. 暴力动规是O ...

随机推荐

  1. C#程序变量统一管理例子 - 开源研究系列文章

    今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子. 我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理.这里笔者使用到的公共变量管理库 ...

  2. KVM下windows由IDE模式改为virtio模式蓝屏 开不开机

    KVM安装Windows默认使用的是qemu虚拟化IDE硬盘模式,在这种情况下,IO性能比较低,如果使用virtio的方式可以提高虚拟机IO性能. 于是我想将这台虚拟机迁移到openstack中管理 ...

  3. CTFshow misc1-10

    小提示:需要从图片上提取flag文字,可以通过截图翻译或者微信发送图片,这两个的ai图像识别挺好用的. misc1: 解压打开就能看见flag,提取出来就行 misc2: 记事本打开,看见 ng字符, ...

  4. Jmeter+Ant+Jenkins接口自动化框架(续)

    前段时间给公司内部项目搭建了一套接口自动化框架,基于实际使用,需要配置自动发送邮件功能,将 执行结果发送给相关负责人.Jenkins本身也提供了一个邮件通知功能,但在提供详细的邮件内容.自定义邮 件格 ...

  5. 设置启动WebSocket并配置程序池

    开启WebSocket服务 1.导航到"控制面板" > "程序" > "程序和功能" > "启用或禁用 Wind ...

  6. CF82D Two out of Three

    题目描述 Vasya has recently developed a new algorithm to optimize the reception of customer flow and he ...

  7. C#软件架构设计原则

    软件架构设计原则 学习设计原则是学习设计模式的基础.在实际的开发过程中,并不是一定要求所有的代码都遵循设计原则,而是要综合考虑人力.成本.时间.质量,不刻意追求完美,要在适当的场景遵循设计原则.这体现 ...

  8. P8679 [蓝桥杯 2019 省 B] 填空问题 题解

    P8679 [蓝桥杯 2019 省 B] 填空问题 题解 题目传送门 欢迎大家指出错误并联系这个蒟蒻 更新日志 2023-05-25 21:02 文章完成 2023-05-27 11:34 文章通过审 ...

  9. Java开发面试--群面专区

    目录 一.群面背景 二.群面流程 三.群面角色 四.群面细节 五.群面礼仪 六.群面话术 七.个人演讲 八.群面题型 群面也称无领导小组~ 候选人们被要求在一个相对自由的环境中展示他们的能力,并在没有 ...

  10. Atcoder Regular Contest 167

    卡 B 下大分了. A. Toasts for Breakfast Party 发现题意是让方差尽可能小,就是让 \(A\) 里的值尽可能接近. 所以从小到大排个序,把 \(A_{N,\dots,N- ...