题解

1 条题解

  • 0
    @ 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

信息

ID
2255
难度
9
分类
动态规划 | 数据结构 | 队列单调队列 点击显示
标签
(无)
递交数
2
已通过
1
通过率
50%
被复制
9
上传者