AT_joi2010ho_b 题解

· · 题解

标签:动态规划(dp)。

可设 dp1_i 表示前 i 个位置中,第一个人所需的最小时间,dp2_j 表示前 j 个位置中,第二个人所需的最小时间。

因为在切割的过程中,第一个人和第二个人交替进行切割。第一个人选择切割位置 $i$ 时,第二个人在位置 $j$ 上进行切割。因此,第一个人的最小时间等于 $dp2_j + T_{i+j}$,而第二个人的最小时间等于 $dp1_i + T_{i+j}$。 所以动态规划方程如下: $$ dp1_i = \min(dp1_i, dp2_j + T_{i+j}), dp2_j = \min(dp2_j, dp1_i + T_{i+j}) $$ 最终答案为 $dp1_{n/2}$。 (upd:抱歉手打错了!) code: ``` dp1[0]=0,dp2[0]=0; for(int i=0; i<=n/2; i++) for(int j=0; j<=n/2; j++) { dp1[i]=min(dp1[i],dp2[j]+T[i+j]); dp2[j]=min(dp2[j],dp1[i]+T[i+j]); } cout<<dp1[n/2]<<endl; ```