有两种优化方式:
- 单调栈+二分
明天去问wzj - 分治
void DP(int l, int r, int k_l, int k_r)
{
int mid = (l + r) / 2, k = k_l;
// 求状态f[mid]的最优决策点
for (int i = k_l; i <= min(k_r, mid - 1); ++i)
if (w(i, mid) < w(k, mid)) k = i;
f[mid] = w(k, mid);
// 根据决策单调性得出左右两部分的决策区间,递归处理
if (l < mid) DP(l, mid - 1, k_l, k);
if (r > mid) DP(mid + 1, r, k, k_r);
}
明天去问gigo,貌似很多的都可以转换成单调队列和斜率优化。