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]);