11月2日

About 2318

  • DP神题。
  • 分析DP时可以画数组来观察结构,DP是以结构间的转移运作的。首先sort是必要的,因为不sort可能不能取到最优解。这题可以追溯到分配类DP的根源,枚举前i个人i,枚举前i个人使用的终点j,枚举前i-1个人使用的终点k,枚举前i个人使用的起点p。而根据dp数组的性质我们可以看到,dp[i][p]存下的就是p-1以前的最优解。由此我们便不用枚举p,只需要考虑j-1的情况——dp[i][j-1]总结了枚举p的所有情况。而根据sort之后的性质我们可以看到,使用越前面的数字(即k越小)会让代价变大,因此我们相当于只需要考虑使用j-1和j两根筷子(必然是选择j的最优情况),再考虑dp[i][j-1](即放弃眼前的j筷子,使用以前的方案)。
dp[i][j]=min(dp[i][j],min(dp[i][j-1],dp[i-1][j-2]+(val[j]-val[j-1])*(val[j]-val[j-1])))
// dp[i][j] 前i个人使用j根筷子
// dp[i][j-1] 不使用第j根筷子,沿用以前方案
// dp[i-1][j-2] 使用第j根以及第j-1根筷子
  • 另外,DP边界小心处理

About 2791

  • 这题暴力可以使用货物搬运(1988)的做法。但是我们还是在此来讨论一下。(这种算法相当于货物搬运类的优化版)

现在假设编号为i的人初始有Ai个糖果。对于1号来说,他给了n号x1个糖果,还剩A1-x1个;但是因为2号给了他x2个糖果,所以最后还剩A1-x1+x2个糖果。根据题设,该金币数等于M。换句话说,我们得到了一个方程:A1-x1+x2=M。同理,对于第2个人,有A2-x2+x3=M。最终,我们可以得到n个方程,一共n个变量:
对于第1个人,A1-x1+x2=M → x2=M-A1+x1=x1-C1 (C1=A1-M)
对于第2个人,A2-x2+x3=M → x3=M-A2+x2=2M-A1-A2+x1=x1-C2 (C2=A1+A2-2M=C1+A2-M)
对于第3个人,A3-x3+x4=M → x4=M-A3+x3=3M-A1-A2-A3+x1=x1-C3 (C3=A1+A2+A3-3M=C2+A3-M)

我们希望所有的xi的绝对值之和(x1+x2+x3+…+xn)尽量小,代入上面所得结论即|x1|+|x1-C1|+|x1-C2|+…+|x1-Cn-1|最小。C数组的构造上面已经体现了。|xi-Ci|可以转化为数轴上点x1到Ci的距离,所以问题转化为:给定数轴上的n个点,找出一个到它们的距离之和尽量小的点。而这个点即为排序后序号为中位数的点,具体见About 1749。

About 1749

  • 顺便做一下分配类DP的区分。筷子(2318)是不完全覆盖整个区间一个个区间,乐队(1802)则是不相交的集合(有间距),而本题则是覆盖完整个区间的小区间。所以套路是不同的。在定义状态的时候我们就不能像之前一样用“点”定义(什么前i个人前j根筷子之类),而是要用“区间”定义(前i个村设j个邮局),而我们此时还要枚举以i为区间末尾的区间起点k。由此可得DP方程:
dp[i][j]=min(dp[i][j],dp[k][j-1]+Sigmadis[k+1][i])
//前i个村设j个邮局的状态由前k个村设j-1个邮局加上k+1到i的“区间距离和”得来。


  • 需要注意的是,我们这里的“区间距离和”为一个区间里面到达该区间所设邮局的最短距离和。使一个区间里面到达某定点距离和最小的某定点为该区间内点排序后编号为中位数的那个点。这种中位数的思想也运用于2791,还有二维版本3481。


结论:给定数轴上的n个点,在数轴上的所有点中,中位数离所有点的距离之和最小。凡是能转化为这个模型的题目都可以用中位数求解。
证明:让我们把数轴和上面的点画出来,如图:数轴和数轴上的点
任意找一个点,比如上图中的灰点,它左边有4个点,右边有2个点。假如把灰点向左移动d单位距离,则灰点左边4个点到它的距离总共减少4d,右边总共增加2d,但总的来说,距离之和减少了2d。换句话说,只要灰点左右的输入点不一样多,就不是最优解。什么情况下左右的输入点一样多呢?如果输入点一共有奇数个,则灰点必须和中间的那个点重合(中位数);如果有偶数个,则灰点可以位于最中间的两个点之间的任意位置(还是中位数)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值