题目描述
解题思路
首先我们可以确定这个题是一个 DP 题,所以我们就要去想这个题的状态转移怎么写,其实很简单
dp[i][j] 表示将第 i 个点到第 j 个点之间所有的点合在一起所花的费用
我们假设有三个点,i,k,k + 1,j,而这三个点是从左往右,从上往下排列的,如下图:
此时的 k 点就是合并 i 和 j 的一个任意中间的分割点,也就是 i 和 k 已经合在一起了,j 和 k + 1 也合在一起了
我们现在要合并 i 和 j,其实就是把 i,k 的合并点和 j,k + 1 的合并点相合并:
我们可以发现 p m pm pm 的长度就是 a [ k ] . y − a [ j ] . y a[k].y - a[j].y a[k].y−a[j].y, p n pn pn 的长度就是 a [ k + 1 ] . x − a [ i ] . x a[k + 1].x - a[i].x a[k+1].x−a[i].x
此时,我们的状态转移就已经得出了:
dp[i][j] 表示把第 i 个点到第 j 个点中的所有点都合起来所用的最小花费
dp[i][j] = dp[i][k] + dp[k + 1][j] + a[k].y - a[j].y + a[k + 1].x - a[i].x
得到状态转移,我们就可以求解了,但我们可以发现,这道题如果用朴素的DP求解是会超时的。所以,我们要加入平行四边形不等式优化
s[i][j]表示dp[i][j]的最佳决策点
这个 s[i][j] 有什么用处呢?
如果我们将 j 点去掉,合并 i 到 j - 1,那么 k 肯定就要往前移动,因为我们肯定要尽量让两边的平衡,所以 s [ i ] [ j − 1 ] <