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

解题思路

首先很容易就想到了一个二维的朴素的 $dp$。

设 $dp[i][j]$ 表示第 $i$ 个位置的电话线杆的高度为 $j$ 时的最小花费,就需要枚举第 $i$ 个电话线杆、第 $i$ 个电话线杆的高度 $j$、第 $i-1$ 个电话线杆的高度 $k$。

状态转移方程如下

$$dp[i][j] = \min \{dp[i-1][k]+|j-k|\times c + (j-h[i])^2\}$$

但是这样的 $dp$ 过不了这题的数据范围。这个 $dp$ 的时间复杂度是 $\text{O}(n\times h^2)$。

所以需要考虑别的方法进行优化。

我们试着只枚举一个 $j$,而不是枚举 $j$ 和 $k$。

首先来说这个 $j$,它既是我们枚举的第 $i$ 个电话线杆的高度也是我们枚举的第 $i-1$ 根电话线杆的高度。$i-1$ 要相对 $i$ 产生影响,那么 $j$ 一定是大于 $h[i-1]$ 的。

我们在 $j\ge h[i-1]$ 时取一个最小值,同时又要消去绝对值的影响。这就要看 $j$ 的枚举顺序了。如果是正序枚举那么之后的j一定会大于当前的j,之后的 $j-$ 现在的 $j$,是正的。

所以现将现在的 $j\times c$ 减掉。到时候进行扩展的时候在将那时的 $j\times c$ 加上。就等价于加上了绝对值。倒序枚举只是换了下顺序,道理还是一样的就不再过多的解释。

再来看 $j\ge h[i]$ 的时候,这时的高度为 $j$ 的第 $i$ 根电话线杆已经能够被更新了。所以就将其更新。

然后再做一遍倒序枚举因为还要考虑 $i-1$ 比 $i$ 高的情况。

附上代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
inline int read() {
    int x = 0, f = 1; char c = getchar();
    while (c < ‘0‘ || c > ‘9‘) {if(c == ‘-‘) f = -1; c = getchar();}
    while (c <= ‘9‘ && c >= ‘0‘) {x = x*10 + c-‘0‘; c = getchar();}
    return x * f;
}
const int maxn = 1e5+3, INF = 1e9;
int n, c, h[maxn], f[maxn][103], Ans = INF;
int main() {
    freopen("phonewire.in", "r", stdin);
    freopen("phonewire.out", "w", stdout);
    n = read(), c = read();
    for(int i=1; i<=n; i++)
        for(int j=0; j<=100; j++)
            f[i][j] = INF;
    for(int i=1; i<=n; i++)
        h[i] = read();
    for(int i=h[1]; i<=100; i++) f[1][i] = (i-h[1]) * (i-h[1]);
    int minn;
    for(int i=2; i<=n; i++) {
        minn = INF;
        for(int j=0; j<=100; j++) {
            if(j >= h[i-1]) minn = min(minn, f[i-1][j] - c*j);
            if(j >= h[i]) f[i][j] = min(f[i][j], minn + c*j + (j-h[i]) * (j-h[i]));
        }
        minn = INF;
        for(int j=100; j>=0; j--) {
            if(j >= h[i-1]) minn = min(minn, f[i-1][j] + c*j);
            if(j >= h[i]) f[i][j] = min(f[i][j], minn - c*j + (j-h[i]) * (j-h[i]));
        }
    }
    for(int i=0; i<=100; i++) Ans = min(Ans, f[n][i]);
    printf("%d", Ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

原文地址:https://www.cnblogs.com/bljfy/p/9582353.html

时间: 2024-08-30 14:20:31

「 COGS 2240 」 X 「 Luogu P2885 」 架设电话线的相关文章

100offer举办的「寻找实干和坚持的技术力量」开源项目投票排名分析程序

由于100offer举办的「寻找实干和坚持的技术力量」开源项目投票活动没有按照票数排序的功能,所以本文写了个小程序来实现这个功能,代码如下: import org.jsoup.Jsoup; import org.jsoup.nodes.Element; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; /**

Linux 小知识翻译 - 「Linux」和「发行版」之间的关系

「Linux」本来指的仅仅是内核.5年之前大多都是这么认为的,但是最近不这么说了. 最近一般都说「Linux」是个 OS,这里的OS,不仅仅是内核,而是指电脑的整体环境(除了内核,还包括一些外围的软件). 内核本来是作为硬件和各种应用软件之间的桥梁而存在的,只有内核的PC是无法使用的. 因此,会将各式各样的软件和内核组合在一起,作为一个可以运行的OS来打包,打包后的OS就被称为「Linux发行版」. 最近,把「Linux发行版」称为「Linux」的情况也比较多了. 但是,「Linux内核」只有一

Linux 小知识翻译 - 「Unix」和「兼容Unix的OS」

经常有人会问「Linux和Unix有什么区别?」,「Linux就是Unix吗?」. 回答一般都是「Linux是仿照Unix而开发的OS」,「Linux和Unix相似但不是一种OS」之类的. 关于「Linux和Unix」,这其中还有些故事. 首先,「Unix」是1970年左右由美国AT&T公司的贝尔实验室开发,并将开发推进下去而形成的OS. 现在,「Unix」这个商标由The Open Group所拥有,因此可以说「Linux不是Unix」. 另一方面,还有一个「Linux不是Unix」的理由.1

「数据结构」和「数据类型」两个概念的本质是什么,区别与联系是什么?

数据结构:相互之间存在一种或多种特定关系的数据元素的集合. 数据类型:是指一组性质相同的值得集合及定义在此集合上的一些操作的总称. 网友观点:数据类型是数据的一种分类,是按照数据结构来分类的.数据类型的出现是为了把数据分成所需内存大小不同的数据. 数据结构强调结构,即元素间的关系:数据类型强调类型,即作用于元素的合法操作. 「数据结构」和「数据类型」两个概念的本质是什么,区别与联系是什么?

世界上最遥远的距离莫过于:「暑假前」和「暑假后」

相信很多人开学第一天的反应都是这样的:不过一个暑假,怎么一切都变得陌生了? 整个学院,焕然一新,清一色的白墙,换上了各种小清新的鹅黄.淡粉,俨然进入了「童话世界」: 校园里挂满了各种欢迎新生的创意横幅,「防火.防盗.防学长」之类的调侃,随处可见: 隔壁班那个心仪的男孩,依然「耀眼」,只是一个暑假后,他的身边俨然多了一个十指相扣的「她」: 就连同一寝室那些曾经最为亲近的人,也变得倍感「陌生」. 分分钟让人徒添一种感慨:世界上最遥远的距离莫过于:「暑假前」和「暑假后」. 人与人之间的差距,是从假期拉

从0開始学习 GitHub 系列之「07.GitHub 常见的几种操作」

之前写了一个 GitHub 系列,反响非常不错,突然发现居然还落下点东西没写,前段时间 GitHub 也改版了,借此机会补充下. 我们都说开源社区最大的魅力是人人多能够參与进去,发挥众人的力量,让一个项目更完好.更强壮.那么肯定有人疑问,我自己眼下还没有能力开源一个项目,可是想一起參与到别的开源项目中.该怎么操作呢?那么今天,就来给大家一起介绍下 GitHub 上的一些常见的操作,看完之后你就知道方法了. 我们姑且以 Square 公司开源的 Retrofit 为例来介绍. 打开链接: http

《iOS「通告机制」及由其引出的对「架构模式」、「设计模式」的理解

说明:为了区别「本地通知」与「推送通知」这两种iOS中提醒用户,可见的「通知」,本文所将Notification翻译为「通告」.它们的详细区别,可参考<iOS开发系列--通知与消息机制>一文. 实践遇到的问题: 最近在维护公司的一个项目中,遇到这样一个报错:-[GlobalManager addAlbum:]: unrecognized selector sent to instance 经排查,原因如下:以前同事在利用「通告机制」在GlobalManager类中把「自己/self」注册为「观

【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(1)

http://www.4gamer.net/games/216/G021678/20140703095/ 新连载「实验做出的游戏图形」,是聚焦在特定游戏的图形上, 对它的结构和使用的技术解说为主旨.之前笔者连载的「西川善司的3D游戏入迷」,覆盖范围都很广,而与特定游戏强关联的技术解说,会在今后的新连载中处理. 作为纪念的第一回选择的,是Arc System Works开发的,2014年2月在街机上运作的格斗游戏「GUILTY GEAR Xrd -SIGN-」 全3D图形的GUILTY GEAR

带你从二次元的角度看建筑「摩根·帝巢丨湛江工程资质×××」

我从小到大是个十足的动漫迷,从小学开始迷恋日本漫画直至现在.从<哆啦A梦>.<樱桃小丸子>这批经典到后来的<海贼王>.<火影忍者>这批灌输热血的鸡汤--但如今似乎更流行二次元动漫. 二次元动漫不仅盛产帅哥美女,还有就是美到让人停止呼吸的建筑!带你从二次元的角度看建筑「摩根·帝巢丨湛江工程资质×××」 引人入胜的故事情节.个性另类的角色设定自然是一部动漫制作成功的必要元素,但是,二次元动漫中呈现的各种或空灵的或美轮美奂的建筑群,也无一不给人以崇高的感觉. 如果