[题解] 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就是传真,传真通信是使用传真机,借助公用通信网或其他通信线路传送图片,文字等信息,并在接收方获得发送原件系统的副本的一种通信方式.传真通信是现代图像通信的重要组成部分,它是目前采用公用电话网传送 ...
随机推荐
- C++笔试题库之编程、问答题 300~305道
301. 以下代码有什么问题? cout << (true?1:”1″) << endl; 答:三元表达式“?:”问号后面的两个操作数必须为同一类型. 302.以下代码能够编译 ...
- 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...
- IT兄弟连 JavaWeb教程 Servlet中定义的变量的作用域类型
在Java语言中,局部变量和实力变量有着不同的作用于,它们的区别如下: 局部变量在一个方法中定义,每当一个线程执行局部变量所在的方法时,在线程的堆栈中就会创建这个局部变量,当线程执行完该方法,局部变量 ...
- Fiddler 学习
Little Skill Fiddler 官网: https://www.telerik.com/fiddler 来自 https://www.cnblogs.com/zhaoyanjun/p/706 ...
- php in_array 的 坑
话不多说,直接上代码 $str = '7.php'; var_dump(in_array($str,range(0,100))); die; 是 true 这是因为 php是弱类型语言,会把7.php ...
- Jquery | 基础 | 使用 jQuery 表单过滤选择器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [NOIP2018校模拟赛]T2矩阵分组 Matrix
题目链接: 矩阵分组 分析: 这道题求的是两部分极差当中大的那个的最小值.对于这种求最值的问题,我们很自然(其实并没有)地想到二分答案. 这个题有两个结论: (好像当时看出来了第一个?然后发现下面都不 ...
- DP Codeforces Round #303 (Div. 2) C. Woodcutters
题目传送门 /* 题意:每棵树给出坐标和高度,可以往左右倒,也可以不倒 问最多能砍到多少棵树 DP:dp[i][0/1/2] 表示到了第i棵树时,它倒左或右或不动能倒多少棵树 分情况讨论,若符合就取最 ...
- CentOS 7.4安装mariadb,启动报错
[root@iZ25b6alxstZ ~]# systemctl start mariadb Job for mariadb.service failed because the control pr ...
- 机器学习概念之特征选择(Feature selection)
不多说,直接上干货! .