题目链接:洛谷 POJ

题目描述
最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线。 新的电话线架设在已有的 N ( 2 ≤ N ≤ 100 , 000 ) N(2\leq N\leq 100,000) N(2≤N≤100,000)根电话线杆上, 第i根电话线杆的高度为 h e i g h t i height_i heighti​米 ( 1 ≤ h e i g h t i ≤ 100 ) (1\leq height_i\leq 100) (1≤heighti​≤100)。

电话线总是从一根电话线杆的顶端被引到相邻的那根的顶端。如果这两根电话线杆的高度不同,那么Farmer John就必须为此支付 C ∗ C* C∗电话线杆高度差 ( 1 ≤ C ≤ 100 ) (1\leq C\leq 100) (1≤C≤100)的费用。当然,你不能移动电话线杆, 只能按原有的顺序在相邻杆间架设电话线。Farmer John认为 加高某些电话线杆能减少架设电话线的总花费,尽管这项工作也需要支出一定的费用。

更准确地,如果他把一根电话线杆加高X米 ( X ≥ 0 ) (X\geq 0) (X≥0)的话,他得为此付出 X 2 X^2 X2 的费用。 请你帮Farmer John计算一下,如果合理地进行这两种工作,他最少要在这个电话线改造工程上花多少钱。

输入格式
第 1 1 1行: 2个用空格隔开的整数: N N N和 C C C
第 2.. N + 1 2..N+1 2..N+1行: 第i+1行仅有一个整数: h e i g h t i height_i heighti​

输出格式
第 1 1 1行: 输出 F a r m e r J o h n Farmer John FarmerJohn完成电话线改造工程所需要的最小花费

O ( n h 2 ) O(nh^2) O(nh2)的 d p dp dp应该不难想到。
d p [ i ] [ j ] dp[i][j] dp[i][j]表示改造并架设前 i i i个电线杆,第 i i i个电线杆高度为 j j j的最小花费。
那么大力枚举 i , j i,j i,j和第 i − 1 i-1 i−1个电线杆的高度 k k k,然后转移:
d p [ i ] [ j ] = m i n ( d p [ i ] [ j ] , d p [ i − 1 ] [ k ] + c ∗ a b s ( j − k ) + ( j − h [ i ] ) ∗ ( j − h [ i ] ) ) dp[i][j]=min(dp[i][j],dp[i-1][k]+c*abs(j-k)+(j-h[i])*(j-h[i])) dp[i][j]=min(dp[i][j],dp[i−1][k]+c∗abs(j−k)+(j−h[i])∗(j−h[i]))

O ( n h 2 ) O(nh^2) O(nh2)的复杂度理论上是过不去的,但因为数据太水卡过了qwq。
考虑优化:
对于递增的 j j j,最优的 k k k值必然不降。
证明:假设电线杆高度为 j j j时,对应的最优的高度为 k k k。
当 j j j变成 j + 1 j+1 j+1时,若 k k k减少为 k − 1 k-1 k−1,则说明电线杆高度为 j j j时,最优的k值应该为 k − 1 k-1 k−1。
因此 k k k不珂能下降。
因此珂以利用这个单调性求解。时间复杂度 O ( n h ) O(nh) O(nh)。
代码:
O ( n h 2 ) O(nh^2) O(nh2)暴力

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<vector>
#define re register int
using namespace std;
typedef long long ll;
int read() {re x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-')  f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=10*x+ch-'0';ch=getchar();}return x*f;
}
const int Size=100005;
const int INF=1e9;
int n,c,h[Size],dp[Size][105];
int main() {n=read();c=read();int maxh=0;for(re i=1; i<=n; i++) {h[i]=read();if(h[i]>maxh)    maxh=h[i];}for(re i=h[1]; i<=maxh; i++) {dp[1][i]=(i-h[1])*(i-h[1]);}for(re i=1; i<=n; i++) {for(re j=h[i]; j<=maxh; j++) {dp[i][j]=INF;for(re k=h[i-1]; k<=maxh; k++) {dp[i][j]=min(dp[i][j],dp[i-1][k]+c*abs(j-k));}dp[i][j]+=(j-h[i])*(j-h[i]);}}int ans=INF;for(re i=h[n]; i<=maxh; i++) {if(dp[n][i]<ans) {ans=dp[n][i];}}printf("%d",ans);return 0;
}

O ( n h ) O(nh) O(nh)优化:

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<vector>
#define re register int
using namespace std;
typedef long long ll;
int read() {re x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-')  f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=10*x+ch-'0';ch=getchar();}return x*f;
}
const int Size=100005;
const int INF=1e9;
int n,c,h[Size],dp[Size][105];
int main() {n=read();c=read();int maxh=0;for(re i=1; i<=n; i++) {h[i]=read();if(h[i]>maxh)    maxh=h[i];}for(re i=h[1]; i<=maxh; i++) {dp[1][i]=(i-h[1])*(i-h[1]);}for(re i=1; i<=n; i++) {int ptr=h[i-1];for(re j=h[i]; j<=maxh; j++) {dp[i][j]=INF;while(ptr<maxh && dp[i-1][ptr+1]+c*abs(j-ptr-1)<dp[i-1][ptr]+c*abs(j-ptr)) {ptr++;}dp[i][j]=dp[i-1][ptr]+c*abs(j-ptr);dp[i][j]+=(j-h[i])*(j-h[i]);}}int ans=INF;for(re i=h[n]; i<=maxh; i++) {if(dp[n][i]<ans) {ans=dp[n][i];}}printf("%d",ans);return 0;
}

POJ3612 洛谷P2885 [USACO07Nov] 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. 【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp

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

  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] 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. [洛谷 1365] WJMZBMR打osu! / Easy {期望DP}

    题目 https://www.luogu.org/problemnew/show/P1365 解题思路 这是我做的第三道期望DP.跟前两道的不同之处,在于它连续的一段具有不确定性且没有给出n的范围.所 ...

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

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

  8. 【洛谷 P4934】 礼物 (位运算+DP)

    题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...

  9. 洛谷P3349:小星星(容斥dp)

    解析 先安利一波洛谷上我介绍如何用暴力日过去的博客 现在开始务正业 考虑把dp记录状态的一维s去掉 这样单次转移复杂度变成n3n^3n3 但是这样显然会算多啊! 因为一个编号可能会用很多次 考虑容斥 ...

最新文章

  1. typora行内公式怎么显示不了,怎么办?
  2. Java Web整合开发(42) -- Petstore
  3. C++ 类的抽象初练
  4. linux内核3.14.4,Linux内核4.14.14,4.9.77,4.4.112和3.18.92更新发布
  5. jqGrid数据增删查改
  6. .NET、TensorFlow和Kaggle的风车
  7. php生成字母数字订单,php生成唯一订单号可控制位数字母和数字
  8. Go的package学习
  9. pythonwin下载中文版_Python官方下载 v3.9.0中文版_Win10镜像官网
  10. vivado基本使用流程(详细版,一步步跟着来一定能成功)
  11. unity3d补间动画DoTween
  12. js实现手机横竖屏事件
  13. 复合型网络拓扑结构图_网络拓扑结构大全和图片(星型、总线型、环型、树型、分布式、网状拓扑结构)...
  14. 简单使用layui完成表格
  15. mysql删除列命令_MySQL删除列
  16. 二阶系统响应指标图_二阶系统的脉冲响应.ppt
  17. thingsboard安装源码编译
  18. NORDIC Thingy:52 蓝牙 BLE 服务 SoC 程序调用流程分析之八, 网盘分享 PPT
  19. “心脏出血”漏洞可导致密码泄露
  20. 将一串数字拆分成单个数字

热门文章

  1. ORA-00257: oracle报archiver error的解决方法
  2. 揭秘eBay四大系统 从行为数据中寻找价值
  3. repeatation翻译_半导体专业术语英语及汉语翻译
  4. 解决ADAMS启动没有欢迎对话框的解决办法
  5. 停止服务器上运行的项目,重新部署项目
  6. (C++)Windows自动锁屏程序
  7. 广义相对论-学习记录11-第五章-引力辐射1
  8. 这些中秋礼盒绝了,悄悄惊艳互联网人
  9. angular使用微信开放标签
  10. 对AudioService 的认识(1)