Processing math: 100%

P2885 [USACO07NOV]电话线Telephone Wire

P2885 [USACO07NOV]电话线Telephone Wire

最近,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计算一下,如果合理地进行这两种工作,他最少要在这个电话线改造工程上花多少钱。

Solution

设计dp状态为 dp[i][j] 表示考虑前 i 个柱子, 并且将第 i 个柱子的高度改造为 j 的最小花费
容易想出 dp 方程: dp[i][j]=min(dp[i1][k]+(jh[i])2+|jk|c)
复杂度 O(nC2)
考虑优化
发现绝对值比较难处理
我们先把无关 k 的值提出来, 分类讨论处理一下绝对值

dp[i][j]=min(dp[i1][k]ck)+(jh[i])2+cj   (jk)

dp[i][j]=min(dp[i1][k]+ck)+(jh[i])2cj   (jk)

然后 min 里可以用一个变量维护
处理绝对值分别正序倒叙枚举即可

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(LL i = (x);i <= (y);i++)
using namespace std;
LL RD(){
    LL out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const LL maxn = 200019, inf = 0xfffffffffffffff;
LL num, c, h[maxn];
LL dp[maxn][119];
LL maxx;
void init(){
	num = RD(), c = RD();
	REP(i, 1, num)h[i] = RD(), maxx = max(maxx, h[i]);
	REP(i, 0, num)REP(j, 0, maxx)dp[i][j] = inf;
	}
void solve(){
	REP(i, h[1], maxx)dp[1][i] = (h[1] - i) * (h[1] - i);
	REP(i, 2, num){
		LL minn = inf;
		REP(j, h[i - 1], maxx){
			minn = min(minn, dp[i - 1][j] - j * c);
			if(j < h[i])continue;
			LL add = (j - h[i]) * (j - h[i]);
			dp[i][j] = min(dp[i][j], minn + add + j * c);
			}
		minn = inf;
		for(int j = maxx;j >= h[i];j--){
			minn = min(minn, dp[i - 1][j] + j * c);
			LL add = (j - h[i]) * (j - h[i]);
			dp[i][j] = min(dp[i][j], minn + add - j * c);
			}
		}
	LL ans = inf;
	REP(i, h[num], maxx)ans = min(ans, dp[num][i]);
	printf("%lld\n", ans);
	}
int main(){
	init();
	solve();
	return 0;
	}
posted @   Tony_Double_Sky  阅读(194)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理
点击右上角即可分享
微信分享提示