洛谷 P3842 [TJOI2007] 线段 python解析

P3842 [TJOI2007] 线段

时间:2023.11.7
题目地址:[TJOI2007] 线段

题目分析

这题就是练一下动态规划的。
首先确定dp数组: d p [ i ] [ 0 / 1 ] dp[i][0/1] dp[i][0/1] i i i代表第几行,然后每行 d p [ i ] [ 0 ] dp[i][0] dp[i][0]代表的就是每次走完这一行线段后停在 l e f t left left的最短距离;每行 d p [ i ] [ 1 ] dp[i][1] dp[i][1]代表的就是每次走完这一行线段后停在 r i g h t right right的最短距离。
只有可能是停在这一行的两个位置左端点或者右端点,其余点不可能会满足最小的。
然后,就是状态转移方程了。
d p [ i ] [ 0 ] = m i n ( d p [ i − 1 ] [ 0 ] + a b s ( a [ i ] [ 1 ] − a [ i − 1 ] [ 0 ] ) , d p [ i ] [ 1 ] + a b s ( a [ i ] [ 1 ] − a [ i − 1 ] [ 1 ] ) ) + l e n ( i ) + 1 dp[i][0] = min(dp[i-1][0] + abs(a[i][1] - a[i-1][0]), dp[i][1] + abs(a[i][1]-a[i-1][1])) + len(i) + 1 dp[i][0]=min(dp[i1][0]+abs(a[i][1]a[i1][0]),dp[i][1]+abs(a[i][1]a[i1][1]))+len(i)+1
d p [ i ] [ 0 ] = m i n ( d p [ i − 1 ] [ 0 ] + a b s ( a [ i ] [ 0 ] − a [ i − 1 ] [ 0 ] ) , d p [ i ] [ 1 ] + a b s ( a [ i ] [ 0 ] − a [ i − 1 ] [ 1 ] ) ) + l e n ( i ) + 1 dp[i][0] = min(dp[i-1][0] + abs(a[i][0] - a[i-1][0]), dp[i][1] + abs(a[i][0]-a[i-1][1])) + len(i) + 1 dp[i][0]=min(dp[i1][0]+abs(a[i][0]a[i1][0]),dp[i][1]+abs(a[i][0]a[i1][1]))+len(i)+1
直接看肯定是有点抽象,建议直观画图来理解。
1
2
还有其他几种位置不同的但加上绝对值后,其实发现就是一样的,跟位置没什么关系,找到点与点之间的距离是多走的就行了。
最后是要到 n n n所以还有简单的加上最后一段路就行了。
ac

代码

n = int(input())
a = [[0, 0] for _ in range(n+1)] # 存第i行的左右端点
for i in range(n):
    l, r = map(int, input().split())
    a[i+1][0] = l
    a[i+1][1] = r

dp = [[0, 0] for _ in range(n+1)]
# 初始化,理解不了就画图看一下关系就行了
dp[1][0] = 2*a[1][1] - a[1][0] - 1  
dp[1][1] = a[1][1] - 1
for i in range(2, n+1):
    dp[i][0] = min(dp[i-1][0] + a[i][1]-a[i][0] + abs(a[i][1]-a[i-1][0]), dp[i-1][1] + a[i][1]-a[i][0] + abs(a[i][1]-a[i-1][1]))+1
    dp[i][1] = min(dp[i-1][0] + a[i][1]-a[i][0] + abs(a[i][0]-a[i-1][0]), dp[i-1][1] + a[i][1]-a[i][0] + abs(a[i][0]-a[i-1][1]))+1
# 最终到达n
print(min(dp[n][0] + n - a[n][0], dp[n][1] + n - a[n][1]))
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值