luogu P3842 [TJOI2007] 线段
link
好题,考虑如何设定状态。
设\(dp_{i,0/1}\)表示到了第\(i\)行走完后停在这一行的最左侧/最右侧。
设定\(l_i\)表示这一行该线段的最左侧,\(r_i\)表示这一行的最右侧。
思考如何转移。
1.当我处在这一行的最左侧时,我需要从这一行的右端点转移过来,所以你的贡献要加上这个线段的长度,你再考虑能从上一行的哪个位置再向下走一步能转移到这个线段的右侧,这个时候存在两个情况:
- 上一行的位置在最左侧,那么这个时候你的移动距离肯定就是\(abs(l_{i-1}-r_i)\)。
- 上一行的位置在最右侧,那么这个时候你的移动距离肯定就是\(abs(r_{i-1}-r_i)\)。
综上所述可以得到以下转移方程
\[dp_{i,0} = \min(dp_{i-1,0}+abs(l_{i-1}-r_i),dp_{i-1,1}+abs(r_{i-1}-r_i))+abs(r_i-l_i)+1
\]
右侧则同理,非常简单,也可以得到一个转移方程:
\[dp_{i,1} = \min(dp_{i-1,0}+abs(l_i-l_{i-1}),dp_{i-1,1}+abs(l_i-r_{i-1}))+abs(r_i-l_i)+1
\]
直接枚举每一行转移即可,答案就是\(\min(dp_{n,0}+n-l_n,dp_{n,1}+n-r_n)\)。因为你还要走到\((n,n)\)的这个位置。
那么初始值是什么呢?
对于第一行显然\(dp_{1,0} = r_1-l_1+r_1-1\),\(dp_{1,1} = r_1-l_1\),直接随便坐就可以了。