[题解] cogs 2240 架设电话线路
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 架设电话线路的更多相关文章
- 「 COGS 2240 」 X 「 Luogu P2885 」 架设电话线
解题思路 首先很容易就想到了一个二维的朴素的 $dp$. 设 $dp[i][j]$ 表示第 $i$ 个位置的电话线杆的高度为 $j$ 时的最小花费,就需要枚举第 $i$ 个电话线杆.第 $i$ 个电话 ...
- 「Poetize7」电话线路
描述 每台电话都有一个独一无二的号码,用一个十位的十进制数字串表示.电话a和b之间能直接通信,当且仅当“a与b之间仅有一个数字不同”,或者“交换a的某 两位上的数字后,a与b相同”.而a.b之间建立通 ...
- [题解] cogs 1669 神秘的咒语
http://cogs.pro:8080/cogs/problem/problem.php?pid=1669 "The Real Incantation is Their Common In ...
- dp专练
dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...
- 洛谷 P1991 无线通讯网 题解
P1991 无线通讯网 题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- P1991 无线通讯网 最小生成树
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- FAX modem和传真协议简介
FAX就是传真,传真通信是使用传真机,借助公用通信网或其他通信线路传送图片,文字等信息,并在接收方获得发送原件系统的副本的一种通信方式.传真通信是现代图像通信的重要组成部分,它是目前采用公用电话网传送 ...
随机推荐
- JAVA基础--面向对象09
一.适配器设计模式 1.适配器模式 adapter:适配器: 电脑电源适配器:作用:转换电压,将不符合使用要求的220伏特的市电转换成我们电脑可以使用的电压: 适配器:将不符合使用要求的东西转换成符合 ...
- Ant Design Vue项目解析-前言
源码系列文章很长时间没有更新,一是在考虑文章用什么方式写质量会更高,用什么方式总结更易于扩展和总结知识点,加上工作.看书.健身占用的时间比较多所以也没时间去整理.最近在网上看到一篇文章感觉这种方式不错 ...
- 51nod1127【尺取】
思路: 尺取,写挫了,debug了半天. #include <bits/stdc++.h> using namespace std; typedef long long LL; const ...
- python __builtins__ classmethod类 (11)
11.'classmethod', 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等. class cla ...
- bzoj 4259 4259: 残缺的字符串【FFT】
和bzoj 4503 https://www.cnblogs.com/lokiii/p/10032311.html 差不多,就是再乘上一个原串字符 有点卡常,先在点值下算最后一起IDFT #inclu ...
- Luogu P2051[AHOI2009]中国象棋【dp】By cellur925
题目传送门 题目大意:给定一个$n*m$的棋盘,求放三个“炮”使它们不共行也不共列的方案数.($n,m$$<=100$) 这题主要是转移比较困难,因为情况比较多,所以需要冷静大胆细心地进行分情况 ...
- 如何用Zookeeper来实现分布式锁?
什么是Zookeeper临时顺序节点? 例如 : / 动物 植物 猫 仓鼠 荷花 松树 Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Zonde.# Znode分为四种类型 ...
- display:table / display:table-cell 用法
display:table 元素会作为块级表格来显示(类似table):表格前后带有换行符: display:table-cell 元素会作为表格单元格来显示(类似<td> 和 < ...
- oracle中的用户详解 【转】
oracle中的用户很多,也很令初学者费解.oracle中的帐户分为两类:一类是必需的帐户,一类是存储各种应用的帐户 用户名 密码 描述 ANONYMOUS ANONYMOUS 访问http的匿名 ...
- Android Studio编译开源项目(含NDK开发)常见报错
1.未设置NDK的路径 Error:Execution failed for task ':library:ndkBuild'. > A problem occurred starting pr ...