bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)

1705: [Usaco2007 Nov]Telephone Wire 架设电话线

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 441  Solved: 247
[Submit][Status][Discuss]

Description

最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线。 新的电话线架设在已有的N(2 <= N <= 100,000)根电话线杆上, 第i根电话线杆的高度为height_i米(1 <= height_i <= 100)。 电话线总是从一根电话线杆的顶端被引到相邻的那根的顶端 如果这两根电话线杆的高度不同,那么FJ就必须为此支付 C*电话线杆高度差(1 <= C <= 100)的费用。当然,你不能移动电话线杆, 只能按原有的顺序在相邻杆间架设电话线。Farmer John认为 加高某些电话线杆能减少架设电话线的总花费,尽管这项工作也需要支出一定的费用。 更准确地,如果他把一根电话线杆加高X米的话,他得为此付出X^2的费用。 请你帮Farmer John计算一下,如果合理地进行这两种工作,他最少要在这个电话线改造工程上花多少钱。

Input

* 第1行: 2个用空格隔开的整数:N和C

* 第2..N+1行: 第i+1行仅有一个整数:height_i

Output

* 第1行: 输出Farmer John完成电话线改造工程所需要的最小花费

Sample Input

5 2
2
3
5
1
4
输入说明:
一共有5根电话线杆,在杆间拉电话线的费用是每米高度差$2。
在改造之前,电话线杆的高度依次为2,3,5,1,4米。


Sample Output

15
输出说明:
最好的改造方法是:Farmer John把第一根电话线杆加高1米,把第四根加高2米,
使得它们的高度依次为3,3,5,3,4米。这样花在加高电线杆上的钱是$5。
此时,拉电话线的费用为$2*(0+2+2+1) = $10,总花费为$15。
/*
f[i][j] = min(f[i-1][k]+|j-k|*c+(a[i]-j)*(a[i]-j))
摘出与k无关项得
f[i][j] = min(f[i-1][k]+|j-k|*c) + (a[i]-j)*(a[i]-j)
记P = min(f[i-1][k]+|j-k|*c) , Q = (a[i]-j)*(a[i]-j)
则f[i][j] = P + Q
P = min(A,B),其中
A = min(f[i-1][k]+(j-k)*c) (k<=j)
B = min(f[i-1][k]+(k-j)*c) (k>j)
A = min(f[i-1][k]-k*c) + j*c
B = min(f[i-1][k]+k*c) - j*c
记C[X][i] = min(f[X][k] - k*c)  k∈[1,i]
记D[X][i] = min(f[X][k] + k*c)  k∈[i,n]
则A = C[i-1][j] + j*c
则B = D[i-1][j+1] - j*c
显然C、D在任何时刻只需保存X=i-1一行的值
注意高度只能增高,所以h[i]∈[a[i],100]
利用辅助数组优化后,时间复杂度降为O(N*100)
*/
#include<iostream>
#include<cstdio>
#include<cstring>#define N 100010
#define H 110
#define inf 0x3f3f3f3fusing namespace std;
int n,c,h,P,Q,A,B;
int a[N],C[H],D[H],f[N][H];int main()
{scanf("%d%d",&n,&c);for(int i=1;i<=n;i++) scanf("%d",&a[i]);h=a[1];for(int i=1;i<=n;i++) h=max(h,a[i]);h=min(h,100);memset(f,0x3f,sizeof f);for(int i=1;i<=n;i++){if(i==1) for(int j=a[i];j<=h;j++)f[1][j]=(j-a[1])*(j-a[1]);else{for(int j=a[i];j<=h;j++){Q=(j-a[i])*(j-a[i]);A=C[j]+j*c;B=D[j+1]-j*c;P=min(A,B);f[i][j]=P+Q;}}C[0]=D[h+1]=inf;for(int j=1;j<=h;j++) C[j]=min(C[j-1],f[i][j]-j*c);for(int j=h;j>=1;j--) D[j]=min(D[j+1],f[i][j]+j*c);}int ans=inf;for(int i=1;i<=h;i++) ans=min(ans,f[n][i]);printf("%d\n",ans);return 0;return 0;return 0;
}

 

转载于:https://www.cnblogs.com/L-Memory/p/7337521.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于6G,这些你应该了解

来源&#xff1a;内容来自公众号中国电子报——赛迪智库前 言当前&#xff0c;全球新一轮科技革命和产业变革正在加速演进&#xff0c;人工智能&#xff08;AI&#xff09;、VR/AR、三维&#xff08;3D&#xff09;媒体和物联网等新一代信息通信技术的广泛应用产生了巨大的传输…

php显示动态通告信息方式,Joomla PHP通知,警告和错误指南

网站不可避免地会出现问题。无论您使用的是Joomla还是其他产品&#xff0c;都需要发现并修复问题。Joomla使用PHP&#xff0c;当PHP有问题时&#xff0c;它将向您报告。但是&#xff0c;这些错误通常会出现在您的网站上&#xff0c;并且对访问者可见&#xff1a;在本教程中&…

Facebook爆锤深度度量学习:该领域13年来并无进展!网友:沧海横流,方显英雄本色...

来源&#xff1a;AI科技评论近日&#xff0c;Facebook AI和Cornell Tech的研究人员近期发表研究论文预览文稿&#xff0c;声称近十三年深度度量学习&#xff08;deep metric learning&#xff09; 领域的目前研究进展和十三年前的基线方法(Contrastive, Triplet) 比较并无实质提…

赛码网算法: 军训队列( python实现 )

军训队列 题目描述某大学开学进行军训队列训练&#xff0c;将学生从一开始按顺序依次编号&#xff0c;并排成一行横队&#xff0c;训练的规则如下&#xff1a;从头开始一至二报数&#xff0c;凡报到二的出列剩下的依次向前靠拢&#xff0c;再从头开始…

win7 怎么干净删除php,window_win7系统如何删除注册表里面的垃圾文件?,win7系统如何删除注册表里面的 - phpStudy...

win7系统如何删除注册表里面的垃圾文件&#xff1f;win7系统如何删除注册表里面的垃圾文件&#xff1f;在win7系统中我们可以通过删除或修改注册表的垃圾文件&#xff0c;来提高系统的运行速度&#xff0c;但是在删除注册表过程中&#xff0c;如果错误修改的话会导致计算机无法…

不可不看的干货——机器人自主系统的技术构建:感知、决策和执行

来源&#xff1a;机器人大讲堂近年来&#xff0c;随着工业 4.0 标准的不断推进和人工智能、物联网、大数据等技术的快速发展&#xff0c;机器人产业迎来新一轮浪潮&#xff0c;正逐步向系统化、模块化、智能化的方向发展。除了传统的工业机器人外&#xff0c;在特种机器人和服务…

php伪数组转换为数组,JavaScript伪数组用法实例

在Javascript中什么是伪数组&#xff1f;伪数组(类数组)&#xff1a;无法直接调用数组方法或期望length属性有什么特殊的行为&#xff0c;但仍可以对真正数组遍历方法来遍历它们。本文实例讲述了JavaScript伪数组用法&#xff0c;希望能帮助到大家。1.典型的是函数的 argument参…

前端开发神器 vscode 常用快捷键

主命令框 F1 或 CtrlShiftP: 打开命令面板。在打开的输入框内&#xff0c;可以输入任何命令&#xff0c;例如&#xff1a; 按一下 Backspace 会进入到 CtrlP 模式在 CtrlP 下输入 > 可以进入 CtrlShiftP 模式在 CtrlP 窗口下还可以: 直接输入文件名&#xff0c;跳转到文件?…

前沿科技 | 中科院科学家研究揭示奥陶纪末生命大灭绝新机制

来源&#xff1a;中国科学院火山活动是全球气候变化和海洋化学组成巨变的主要驱动力之一&#xff0c;其中“平流层火山喷发”&#xff08;即火山物质喷发至平流层-大约离地表20公里&#xff09;对全球气候有直接的影响。在过去5.4亿年的地质历史中&#xff0c;发生了数次大规模…

php console postman,postman内置脚本说明

.内置脚本说明1. 清除一个全局变量Clear a global variable对应脚本&#xff1a;postman.clearGlobalVariable("variable_key");参数&#xff1a;需要清除的变量的key 2.清除一个环境变量Clear an environment variable对应脚本&#xff1a;postman.clearEnvironmen…

Minimum Path Sum

题目 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 方法 从左上方到右下方&#xff0c;仅…

空地通信传输详解——飞机是这样和地面通信的

来源&#xff1a;电子万花筒飞机在空中飞行时是如何与地面联络的呢&#xff1f;飞机在飞行中的数据如何进行空地传输呢&#xff1f;那些部件的数据可以被传输呢&#xff1f;飞机的导航、通信、识别系统主要就是保证飞行的&#xff0c;保障在天上、空对空、空对地、地对空、空对…

win8 oracle10g,win7/win8 下安装oracle10g的方法

我的Oracle 10g版本是10.2.0.1.0&#xff0c;选择高级安装&#xff0c;提示“程序异常终止&#xff0c;发生未知错误”。1.修改Oracle 10G\database\stage\prereq\db\refhost.xml当打开refhost.xml 后会发现有.....只要在 后面添加2.到install目录中找到oraparam.ini文件&#…

​IBM人工智能芯片的新进展

来源&#xff1a;内容由半导体行业观察&#xff08;ID&#xff1a;icbank&#xff09;编译自「Venturebeat」&#xff0c;谢谢。IBM苏黎世实验室的研究人员本周在Nature Communications上发表了一篇论文。在文中他们声称&#xff0c;基于相变存储器的技术&#xff0c;他们已经开…

php程序员写bug,程序员的修炼-我们为什么会编写BUG

在最近的一周,我维护的业务系统出现了很多坏毛病,一周七天crash掉了4次,每次都需要都是因为一点很小的问题,触发了蝴蝶效应,导致整个系统全盘崩溃,于是产生除了叙述本篇的想法,当然这并不是为了掩盖我在Coding上的一些细节处理和职责疏忽&#xff0c;只是为了从根本的细节上去分…

强人工智能和弱人工智能

来源&#xff1a;人机与认知实验室人工智能的一个比较流行的定义&#xff0c;也是该领域较早的定义&#xff0c;是由当时麻省理工学院的约翰麦卡锡在1956年的达特矛斯会议上提出的&#xff08;对此有争议&#xff09;&#xff1a;人工智能就是要让机器的行为看起来就像是人所表…

51Nod - 1183 编辑距离

问题&#xff1a;找出字符串的编辑距离&#xff0c;即把一个字符串s1最少经过多少步操作变成编程字符串s2&#xff0c;操作有三种&#xff0c;添加一个字符&#xff0c;删除一个字符&#xff0c;修改一个字符 解析&#xff1a; 首先定义这样一个函数——edit(i, j)&#xff0c;…

张亚勤2020寄语哥伦比亚大学毕业生:引领未知时代

(哥伦比亚大学巴特勒图书馆&#xff09;2020年5月18日&#xff0c;人工智能和数字视频的世界级科学家和企业家&#xff0c;美国艺术与科学院院士、百度前总裁、清华大学智能科学讲席教授张亚勤博士&#xff0c;在哥伦比亚大学工程学院的毕业典礼上发表了主题演讲。张亚勤说:“面…

oracle跳过undo回滚段启动,[Oracle] 解析在没有备份的情况下undo损坏怎么办

如果Oracle在运行中很不幸遇到undo损坏&#xff0c;当然最好的方法是完全恢复&#xff0c;不过如果没有备份&#xff0c;可以采用一种非常规的手段(利用Oracle的隐藏参数)&#xff0c;如果此时undo包含未提交的事务&#xff0c;会造成一点点的数据丢失(一般都是可忍受的)&#…

String s=hello;s+=world;s变化了吗?原始的String对象的内容变了吗?

分析: String s"hello";s"world"; 引用变量s 一开始指向String对象("hello" :0x001); ("world":0x002); s拼接后,就重新指向String对象("helloworld":0x003); 答:s改变了,原始的String对象 "hello" 内容并没有改变…