[USACO07NOV]电话线Telephone Wire
[USACO07NOV]电话线Telephone Wire
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入
Line 1: Two space-separated integers: N and C
- Lines 2..N+1: Line i+1 contains a single integer: heighti
输出
- Line 1: The minimum total amount of money that it will cost Farmer John to attach the new telephone wire.
样例输入
样例输出
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
using namespace std;
long long n,m;
long long a[],f[][],mmax;
int main()
{
long long i,j,k;
scanf("%lld%lld",&n,&m);
memset(f,/,sizeof(f));
for(i=;i<=n;i++)
{
scanf("%lld",&a[i]);
mmax=max(mmax,a[i]);
}
for(i=a[];i<=mmax;i++)
{
int s=i-a[];
f[][i]=s*s;
}
for(i=;i<=n;i++)
{
for(j=a[i-];j<=mmax;j++)
{
for(k=a[i];k<=mmax;k++)
{
int s=k-a[i];
f[i][k]=min(f[i][k],s*s+f[i-][j]+m*abs(j-k));
}
}
}
long long ans=;
for(i=a[n];i<=mmax;i++)
ans=min(ans,f[n][i]);
cout<<ans;
return ;
}
显然是需要优化的,仔细想一想就可以看出,每次实际上只有两种情况:
1.i-1的高度比i低。
2.i-1的高度比i高。
第一种情况下f[i][j]的结果为f[i-1][min]+abs(j-min)*k+(j-a[i])^2显然是有最小值的,所以只要记录min就可以直接算出f[i][j]的值。
第二种情况下f[i][j]的结果为f[i-1][min]+abs(j-min)*k+(j-a[i])^2,但由于随着j的增加每次min的值都有可能会改变,所以需要用到一个单调队列来记录最小值。
以下为AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
using namespace std;
long long n,m;
long long a[],f[][],mmax;
int main()
{
long long i,j,k;
scanf("%lld%lld",&n,&m);
memset(f,,sizeof(f));
for(i=; i<=n; i++)
{
scanf("%lld",&a[i]);
mmax=max(mmax,a[i]);
}
for(i=a[]; i<=mmax; i++)
{
int s=i-a[];
f[][i]=s*s;
}
for(i=; i<=n; i++)
{
int p[],head=,tail=,mmin=;
for(j=a[i-];j<a[i];j++)
{
if(f[i-][j]+abs(a[i]-j)*m<f[i-][mmin]+abs(a[i]-mmin)*m||mmin==)
mmin=j;
}
int ssss=max(a[i],a[i-]);
p[++tail]=ssss;
for(j=ssss+;j<=mmax;j++)
{
while(f[i-][j]+abs(j-a[i])*m<f[i-][p[tail]]+abs(p[tail]-a[i])*m&&head<=tail)tail--;
p[++tail]=j;
}
for(j=a[i];j<=mmax;j++)
{
f[i][j]=min(f[i][j],f[i-][mmin]+abs(j-mmin)*m+(j-a[i])*(j-a[i]));
f[i][j]=min(f[i][j],f[i-][p[head]]+abs(j-p[head])*m+(j-a[i])*(j-a[i]));
if(f[i-][mmin]-abs(j-mmin)*m>f[i-][j])mmin=j;
if(p[head]==j)head++;
}
}
long long ans=1e18;
for(i=a[n]; i<=mmax; i++)
ans=min(ans,f[n][i]);
cout<<ans;
return ;
}
[USACO07NOV]电话线Telephone Wire的更多相关文章
- P2885 [USACO07NOV]电话线Telephone Wire
P2885 [USACO07NOV]电话线Telephone Wire 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话 ...
- P2885 [USACO07NOV]电话线Telephone Wire——Chemist
题目: https://www.luogu.org/problemnew/show/P2885 由于把每一根电线杆增加多少高度不确定,所以很难直接通过某种方法算出答案,考虑动态规划. 状态:f [ i ...
- [luoguP2885] [USACO07NOV]电话线Telephone Wire(DP + 贪心)
传送门 真是诡异. 首先 O(n * 100 * 100) 三重循环 f[i][j] 表示到第 i 个柱子,高度是 j 的最小花费 f[i][j] = min(f[i - 1][k] + abs(k ...
- 【USACO07NOV】电话线Telephone Wire
题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N <= 100,000)根电线杆上, 第 i 根电线杆的高度为 height_i 米(1 <= heigh ...
- [USACO 07NOV]电话线Telephone Wire
题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...
- 【动态规划】bzoj1705: [Usaco2007 Nov]Telephone Wire 架设电话线
可能是一类dp的通用优化 Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设 ...
- DP+滚动数组 || [Usaco2007 Nov]Telephone Wire 架设电话线 || BZOJ 1705 || Luogu P2885
本来是懒得写题解的…想想还是要勤发题解和学习笔记…然后就滚过来写题解了. 题面:[USACO07NOV]电话线Telephone Wire 题解: F[ i ][ j ] 表示前 i 根电线杆,第 i ...
- BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP
BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是 ...
- bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
1705: [Usaco2007 Nov]Telephone Wire 架设电话线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 441 Solved: ...
随机推荐
- .Net程序员学用Oracle系列(24):数据字典、死锁
1.静态数据字典 1.1.实用静态数据字典 1.2.运用静态数据字典 2.动态数据字典 2.1.实用动态性能视图 2.2.运用动态性能视图 3.死锁 3.1.定位死锁 3.2.解锁方法 3.3.强制删 ...
- bootstrap基础
相信大多数后端开发人员的html,css并不是太好(主要说我).想要做一些网页效果,难度会比较大.看了下bootstrap这个前端框架,发现这个框架比较好的解决了网页效果制作中一般性问题.总的来说,b ...
- BM25和Lucene Default Similarity比较 (原文标题:BM25 vs Lucene Default Similarity)
原文链接: https://www.elastic.co/blog/found-bm-vs-lucene-default-similarity 原文 By Konrad Beiske 翻译 By 高家 ...
- [刷题]Codeforces 794C - Naming Company
http://codeforces.com/contest/794/problem/C Description Oleg the client and Igor the analyst are goo ...
- 利用有限自动机(finite automata)进行模式匹配
一.有限自动机定义及基本术语: 一个有限自动机 M 是一个5元组(Q, ,A, Σ, δ),其中: Q 是所有状态的有限集合; ∈ Q (属于)是初始状态; A ⊆ Q (子集)是接受状态的集合; ...
- JAVA基础知识面试题
一个JAVA文件可以定义多个类,但是只能有一个是public(也可以没有public类),并且该public的类的名称和JAVA文件名称相同.同时一个java文件可以有多个main方法,只有和java ...
- 一个简单易用的容器管理平台-Humpback
什么是Humpback? 在回答这个问题前,我们得先了解下什么的 Docker(哦,现在叫 Moby,文中还是继续称 Docker). 在 Docker-百度百科 中,对 Docker 已经解释得很清 ...
- 数组的重排序方法reverse()和sort()
js数组中存在两个可以直接用来重排序的方法:reverse()和sort(). reverse()方法比较简单,直接反转数组项的顺序: var arr = [1, 3, 2, 4, 5]; arr.r ...
- 为什么重写equals时必须重写hashCode方法?(转发+整理)
为什么重写equals时必须重写hashCode方法? 原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html ...
- object-fit 解决图片指定大小被压缩问题
object-fit 解决图片指定大小被压缩问题 第一次遇到这个属性,是在给video 写 poster的时候,选取的作为poster的img的尺寸有点小,导致video播放器两边有留白.在控制台查看 ...