1 条题解
-
0
何老师 (root) LV 0 MOD @ 2023-03-15 17:28:12
动态规划+优化
设 f[i][j] 前i根杆子,第i根杆子高度为j时的最小花费
显然:
当j>h[1]时,f[1][j]=(j-h[1])*(j-h[1])
其他 f[i][j]=inf
方程是:
f[i][j] = max{ f[i-1][k]+C*|j-k|+(j-h[i])^2 | h[i-1]<=k<=100 }
答案是:
Ans=min{f[n][j] | h[n]<=j<=100 }直接实现复杂度O(N*100*100)
优化:
f[i][j] = min{ f[i-1][k]+C*|j-k| | h[i-1]<=k<=100 } + (j-h[i])*(j-h[i])
当 k<=j 时
f[i][j] = min{ f[i-1][k]-C*k | h[i-1]<=k<=j } + (j-h[i])*(j-h[i])+C*j
设 minv1[j]= min{ f[i-1][k]-C*k | h[i-1]<=k<=j }f[i][j] = minv1[j] + (j-h[i])*(j-h[i])+C*j
当 k>=j 时
f[i][j] = max{ f[i-1][k]+C*k | max(h[i-1],j)<=k<=100 } + (j-h[i])*(j-h[i])-C*j
设 minv2[j]= min{ f[i-1][k]-C*k | max(h[i-1],j)<=k<=100 }f[i][j] = minv2[j] + (j-h[i])*(j-h[i])-C*j
填表过程中,在填第i行前,先计算第i-1行的minv1[1]..minv1[100] 和 minv2[100]..minv2[1]
由此时间复杂度为O(N*100)
- 1