1705 Telephone Wire

1705 Telephone Wire

DP的前缀优化
电话线假设在 n根电话杆上,第 i 根电话线高度为h[i] (1<=h[i]<=100) 如果两根电话杆高度不同,则需要花费 c * 电话杆高度差(1<=c<=100)的费用,你不能移动电话杆,只能按原有顺序架设电话线
现在你可以加高某些电话杆,加高 x 米需要花费 x2的代价,求最少花费

首先发现h[i]并不大,所以可以作为状态
设f[i][j]表示架设到了第i根电话杆并且长度为j的最小代价
f[i][j]=min( f[i-1][k]+c*|j-k|+(j-h[i])2 )
枚举i,j状态共nk个,瓶颈在于每个状态需要枚举决策k个高度
首先(j-h[i])2与k无关
f[i][j]=min ( f[i-1][k]+c*|j-k| )+(j-h[i])2

memset(f,0x3f,sizeof(f));
for(int i=h[1];i<=100;i++) f[i]=(i-h[1])*(i-h[1]);
for(int i=2;i<=n;i++){
q[i]=INF;
for(int j=100;j>=1;j--) q[j] = min(f[j]+c*j,q[j+1]);
p[0]=INF;
for(int j=1;j<=100;j++) p[j]=min(p[j-1],f[j]-c*j);
memset(f,0x3f,sizeof(f));
for(int j=h[i];j<=100;j++){
f[j] = (j-h[i])(j-h[i]) + min(p[j]+c*j,q[j]-c*j)
}
}
int ans=INF;
for(int i=1;i<=100;i++) ans=min(ans,f[i]);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值