[USACO2007NOVG] Telephone Wire G
题目描述
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的更多相关文章
- [USACO07NOV]电话线Telephone Wire
[USACO07NOV]电话线Telephone Wire 时间限制: 1 Sec 内存限制: 128 MB 题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N &l ...
- 【USACO07NOV】电话线Telephone Wire
题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N <= 100,000)根电线杆上, 第 i 根电线杆的高度为 height_i 米(1 <= heigh ...
- BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP
BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是 ...
- P2885 [USACO07NOV]电话线Telephone Wire
P2885 [USACO07NOV]电话线Telephone Wire 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话 ...
- 【动态规划】bzoj1705: [Usaco2007 Nov]Telephone Wire 架设电话线
可能是一类dp的通用优化 Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设 ...
- bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
1705: [Usaco2007 Nov]Telephone Wire 架设电话线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 441 Solved: ...
- DP+滚动数组 || [Usaco2007 Nov]Telephone Wire 架设电话线 || BZOJ 1705 || Luogu P2885
本来是懒得写题解的…想想还是要勤发题解和学习笔记…然后就滚过来写题解了. 题面:[USACO07NOV]电话线Telephone Wire 题解: F[ i ][ j ] 表示前 i 根电线杆,第 i ...
- [POJ3612] Telephone Wire(暴力dp+剪枝)
[POJ3612] Telephone Wire(暴力dp+剪枝) 题面 有N根电线杆,初始高度为h[i],要给相邻的两根连线.可以选择拔高其中一部分电线杆,把一根电线杆拔高\(\Delta H\)的 ...
- [USACO 07NOV]电话线Telephone Wire
题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...
- 【POJ3612】【USACO 2007 Nov Gold】 1.Telephone Wire 动态调节
意甲冠军: 一些树高给出.行一种操作:把某棵树增高h,花费为h*h. 操作完毕后连线,两棵树间花费为高度差*定值c. 求两种花费加和最小值. 题解: 跟NOIP2014 D1T3非常像. 暴力动规是O ...
随机推荐
- 【pytorch】目标检测:YOLO的基本原理与YOLO系列的网络结构
利用深度学习进行目标检测的算法可分为两类:two-stage和one-stage.two-stage类的算法,是基于Region Proposal的,它包括R-CNN,Fast R-CNN, Fast ...
- 微服务集成RabbitMq保姆级教程
本文通过简单的示例代码和说明,让读者能够了解微服务如何集成RabbitMq 之前的教程 https://www.cnblogs.com/leafstar/p/17641358.html 在这里我将介绍 ...
- windows下flutter的环境安装
Flutter是谷歌出品的移动应用SDK,性能卓越.体验精美.跨平台.HotReload等等这些特点. Dart是谷歌推出的编程语言.支持即时编译JIT(Just In Time).HotReload ...
- Flask框架——Flask脚本、flask知识点补充
文章目录 Flask_脚本 1 集成Python shell 1.1 flask-script的用法: 1.1.1 实例:flask-script的简单实现 1.1.1命令添加方式: 第一种(无参命令 ...
- RocketMQ版控制台,在左侧
打开IntelliJ IDEA,创建一个Java工程. 在pom.xml文件中添加以下依赖引入Java SDK的依赖库. <dependency> <groupId>org ...
- 一个简单的C4.5算法,采用Python语言
Test1.py 主要是用来运行的 代码如下: # -*- coding: utf-8 -*- from math import log import operator import treePlot ...
- Linux 中如何安全地抹去磁盘数据?
哈喽大家好,我是咸鱼 离过职的小伙伴都知道,离职的时候需要上交公司电脑,但是电脑里面有许多我们的个人信息(聊天记录.浏览记录等等) 所以我们就需要先把这些信息都删除,确保无法恢复之后才上交 即有些情况 ...
- 一次考试的T3
啊这感觉不太可做观察性质,发现这个字符串只由ABC构成这个性质必须利用仅仅由3种字符组成意味着什么呢?这个字符串只有种可能性这个有什么用呢?只是说明暴力枚举的时间复杂度会小一些而已.不止是这些. 首先 ...
- SP3377
题目简化和分析: 前言:这题目背景真奇怪. 我们可以将每种关系,看成一条边,如果出现奇数边环就不满足. 例如:\(a,b\) 异性 \(a,c\) 异性 \(b,c\)异性 这种情况是不满足的. 相当 ...
- STM32 + ESP32(AT固件 MQTT协议) + MQTTX(桌面终端) + (EMQX消息服务器)
翻出老物件,搭建一个简单的 IOT 开发环境,也算是废物利用了 ,接下来加传感器.1. STM32 采集数据: RTOS. 资源相对比较丰富,可以根据项目需求定制.2. ESP32 ...