luogu P3842 [TJOI2007]线段

题目大意

平面上有 n n n 条线段,这些线段都与x轴平行且端点都在格点上,且都在(1,1)与(n,n)之间。计算从(1,1)出发到(n,n)结束并覆盖每一条线段的所有路径中,路程最短的路程。

解题思路

不难想到动态规划。对于每条线段,只有两种状态:左侧进入右侧离开,右侧进入左侧离开。不难写出转移方程。

#include <cstdio>
#include <cstdlib>
#include <cstring>


#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)>0?(x):(-(x)))
const int MAXN=20010;

int n;
int l[MAXN], r[MAXN];
//f[i][j]表示走到第i行线段的左边0或右边1的最优解 
int f[MAXN][5];


int main (){
	scanf ("%d", &n);
	for (int i=1; i<=n; ++i)
		scanf ("%d%d", &l[i], &r[i]);
	f[1][0]=l[1]-1+(r[1]-l[1])*2; f[1][1]=r[1]-1;
	for (int i=2; i<=n; ++i){
		f[i][1]=min (f[i-1][0]+abs (l[i-1]-l[i])+1, f[i-1][1]+abs (r[i-1]-l[i])+1)+r[i]-l[i];
		f[i][0]=min (f[i-1][0]+abs (l[i-1]-r[i])+1, f[i-1][1]+abs (r[i-1]-r[i])+1)+r[i]-l[i];
	}
	printf ("%d", min (f[n][0]+n-l[n], f[n][1]+n-r[n]));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值