http://cogs.pro:8080/cogs/problem/problem.php?pid=2240

与洛谷P2885几乎一致,https://www.luogu.org/problemnew/show/P2885,双倍经验。

定义dp[i][j]表示前i棵树的最大花费并且第i 棵树高度为j的。

我们可以想到这某一棵树的高度与它前边的树有直接的关系,不难有一种想法。

枚举第几棵树1->n

枚举每棵树的高度$h[i]-> max \{ h[1],h[2]...h[n] \} $

枚举第i棵树前边那棵树也就是第i-1棵树的高度。

现在我们想状态转移方程:

当第i棵数的高度为j时,那么需要花费$(j-h[i])^2$,与前边好要有连起来那就需要找到abs(j-dp[i-1][h[i]->maxh])中的最小值。

所以$dp[i][j]=min(dp[i][j],(j-h[i]^2+(j-dp[i-1][h[i]->maxh]) \times c))$.

那么算法时间复杂度为$O(n \times h \times h)$.

时间复杂度虽然比较高,奈何cogs数据比较水啊,勉强可以过。

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int min(int a,int b){ return a<b?a:b; }
int n,a[],c,ans,f[][];
inline int read()
{
char c=getchar();
int x=;
while(c<''||c>'') c=getchar();
while(c>=''&&c<='')
x=(x<<)+(x<<)+c-,c=getchar();
return x;
}
int main()
{
freopen("phonewire.in","r",stdin);
freopen("phonewire.out","w",stdout);
ans=0x7fffffff;
scanf("%d%d",&n,&c);
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<=n;i++)
for(int j=;j<=;j++)
f[i][j]=;
for(int i=;i<=;i++)f[][i]=(i-a[])*(i-a[]);
for(int i=;i<=n;i++)
{
for(int j=a[i];j<=;j++)
{
for(int k=a[i-];k<=;k++)
{
f[i][j]=min(f[i][j],f[i-][k]+(j-a[i])*(j-a[i])+abs(k-j)*c);
}
}
}
for(int i=;i<=;i++)ans=min(ans,f[n][i]);
printf("%d",ans);
fclose(stdin);fclose(stdout);
}

然而洛谷上不吸氧的话就需要优化一下了(以下话语来自洛谷管理---redbag)

不难发现,每次转移是个开口向上的二次函数(可以自己算算),然后我们枚举上一棵树的高度的过程中,

如果随着高度的增加费用增加了,就可以不用继续转移了。

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
char s;
int k=,base=;
while((s=getchar())!='-'&&s!=EOF&&!(s>=''&&s<=''));
if(s==EOF)exit();
if(s=='-')base=-,s=getchar();
while(s>=''&&s<='')
{
k=k*+(s-'');
s=getchar();
}
return k*base;
}
inline void write(int x)
{
if(x<)
{
putchar('-');
write(-x);
}
else
{
if(x/)write(x/);
putchar(x%+'');
}
}
int n,c,p,x,s,mh;
int h[];
int f[][];
int main()
{
n=read();
c=read();
for (register int i=; i<=n; i++)
{
h[i]=read();
if (h[i]>mh) mh=h[i];
}
memset(f,,sizeof(f));
for (register int i=h[]; i<=; i++) f[][i]=(i-h[])*(i-h[]);
for (register int i=; i<=n; i++)
{
for (register int j=h[i]; j<=mh; j++) //hm:电线杆的最大高度
{
s=(j-h[i])*(j-h[i]);//先算出来快些?
p=;
for (register int k=h[i-]; k<=mh; k++)
{
x=f[i-][k]+s+c*abs(k-j);
//下面和这一句是等效的,似乎快点?f[i][j]=min(f[i][j],x);
if (x<f[i][j])
{
f[i][j]=x;
}
if (x>p) break;//比上一个更多就不用转移了
p=x;
}
}
}
int ans=f[n][h[n]];
for (register int i=h[n]+; i<=; i++) ans=min(ans,f[n][i]); //找答案
printf("%d",ans);
return ;
}

[题解] cogs 2240 架设电话线路的更多相关文章

  1. 「 COGS 2240 」 X 「 Luogu P2885 」 架设电话线

    解题思路 首先很容易就想到了一个二维的朴素的 $dp$. 设 $dp[i][j]$ 表示第 $i$ 个位置的电话线杆的高度为 $j$ 时的最小花费,就需要枚举第 $i$ 个电话线杆.第 $i$ 个电话 ...

  2. 「Poetize7」电话线路

    描述 每台电话都有一个独一无二的号码,用一个十位的十进制数字串表示.电话a和b之间能直接通信,当且仅当“a与b之间仅有一个数字不同”,或者“交换a的某 两位上的数字后,a与b相同”.而a.b之间建立通 ...

  3. [题解] cogs 1669 神秘的咒语

    http://cogs.pro:8080/cogs/problem/problem.php?pid=1669 "The Real Incantation is Their Common In ...

  4. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

  5. 洛谷 P1991 无线通讯网 题解

    P1991 无线通讯网 题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  8. P1991 无线通讯网 最小生成树

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  9. FAX modem和传真协议简介

    FAX就是传真,传真通信是使用传真机,借助公用通信网或其他通信线路传送图片,文字等信息,并在接收方获得发送原件系统的副本的一种通信方式.传真通信是现代图像通信的重要组成部分,它是目前采用公用电话网传送 ...

随机推荐

  1. E20180412-hm

    overflow  vt. 溢出,淹没; 挤满,充满; 洋溢; 资源过剩;   n. 泛滥,溢出物; 溢流管; 充溢,过多; 超出额;   vi. 泛滥,溢出; 充溢;

  2. HDU5110:Alexandra and COS(分块+容斥)

    传送门 题意 给出\(n*m\)的矩阵,'X'代表treasure.\(q\)个询问,每次询问(x,y)且频率为d的潜艇能探索到多少财富.探索范围要求abs(x1-x)>=abs(y1-y),也 ...

  3. hdoj1698【线段树Lazy操作】

    区间更新lazy操作一发. #include<cstdio> #include<iostream> #include<string.h> #include<a ...

  4. python __builtins__ enumerate类 (21)

    21.'enumerate', 用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. class enumerate(object ...

  5. P1648 看守

    传送门 以二维的两个点\((x1,y1),(x2,y2)\)为例,那么他们之间的曼哈顿距离肯定为一下四个之一\((x1-x2)+(y1-y2)\),\((x2-x1)+(y1-y2)\),\((x1- ...

  6. USACO Training 3.3 商店购物 By cellur925

    题目传送门 这道题有着浓浓的背包气氛.所以我们可以这样想:可以把每个优惠方案都当做一个物品,每个单买所需要花的钱也当做一个物品.(也就是代码中的p结构体数组)而且基于此题的环境,这题是一个完全背包.另 ...

  7. [NOIP2018校模拟赛]T1 阶乘

    题目: 描述 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. 输入 共两行. 第一行一个正整数n. 第二行n个正整数a[i]. 输出 共 ...

  8. 正则表达式exec方法的陷阱

    http://www.w3school.com.cn/jsref/jsref_exec_regexp.asp exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法 ...

  9. DNS练习之正向解析

    配置正向解析: 主机名:sishen63 主机IP:192.168.1.63 操作系统:Red Hat Enterprise Linux Server release 6.5 (Santiago) 安 ...

  10. c#内存管理,垃圾回收和资源释放

    <1>关于虚拟内存的概念 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上去,这些任务完全由windows后台管理,其实际结果是32位处理机上的每 ...