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. NOJ2026:Keroro侵略地球(01字典树)

    传送门 题意 略 分析 将n个数插入字典树中,m次查询,取最大值,复杂度\(O(mlogn)\) trick 1.注意题目给的空间,开40刚刚够(62852K) 2.作为01字典树的模板保存了 代码 ...

  2. VS代码中常用 正则表达式

    1. #define ABC 1 修改为 enum 样式: #define (.+?)\s+(.+?)$ $1 = $2 ,

  3. hdu1151 Air Raid 基础匈牙利

    #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> ...

  4. iOS UITableView设置tableHeaderView时发生约束错误 UIView-Encapsulated-Layout-Height UIView-Encapsulated-Layout-Width

    在将UITableView的tableHeaderView设置为我自己创建的View的时候, 当我为这个自定义View添加约束之后启动调试, 然后符号断点UIViewAlertForUnsatisfi ...

  5. JS判断字符串长度(英文占1个字符,中文汉字占2个字符)

    //计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: String.prototype.gblen = function() { var len = 0; for (var i=0; i ...

  6. 题解报告:poj 2480 Longge's problem(欧拉函数)

    Description Longge is good at mathematics and he likes to think about hard mathematical problems whi ...

  7. storm的3节点集群详细启动步骤(非HA和HA)(图文详解)

    前期博客 apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)(非HA和HA) 启动storm集群(HA) 本博文情况是 master(主) nimbus slave1( ...

  8. vue-resource emulateJSON的作用

    如果Web服务器无法处理编码为application/json的请求,你可以启用emulateJSON选项. 启用该选项后,请求会以application/x-www-form-urlencoded作 ...

  9. AJPFX关于枚举,泛型详解

    枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义:public enum Color{RED,BLUE,BLACK,YELLOW,G ...

  10. poj1862 Stripies

    思路: 简单贪心. 实现: #include <iostream> #include <cstdio> #include <algorithm> #include ...