洛谷P3842线段【JAVA实现】

2 篇文章 0 订阅

题面

分析


只要弄懂每下一层时起点要不是上一层的左端点或者右端点。就是一个简单的DP

设dp[i][0/1],表示走到第i层的线段并站在左/右端点上所需要走的最短长度。
设L[i],R[i].表示第i层端点位置。
边界情况:dp[1][0/1]可以直接求的。注意走完线段之后到左右端点
显而易见dp公式
dp[i][0/1]=Math.min(dp[i-1][0]+Math.abs(L[i-1]-R/L[i])+R[i]-L[i],dp[i-1[1]+Math.abs(R[i-1]-R/L[i])+R[i]-L[i])+1;

代码


import java.util.Scanner;

public class Main{
	static int n,m;
	static int l[],r[]; //左右端点
	static int f[][];	//dp
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();l=new int[n+1];r=new int[n+1];
		f=new int[n+1][2];
		for (int i =1; i <=n; i++) {
			l[i]=sc.nextInt();r[i]=sc.nextInt();
		}
		f[1][0]=r[1]+r[1]-l[1]-1;f[1][1]=r[1]-1; //边界
		for (int i =2; i <=n; i++) {	
			f[i][0]=Math.min(f[i-1][0]+Math.abs(l[i-1]-r[i])+r[i]-l[i],f[i-1][1]+Math.abs(r[i-1]-r[i])+r[i]-l[i])+1;
			f[i][1]=Math.min(f[i-1][0]+Math.abs(l[i-1]-l[i])+r[i]-l[i],f[i-1][1]+Math.abs(r[i-1]-l[i])+r[i]-l[i])+1;
		}
		//选出最短距离。从最后一层的左右端点到(n,n)
		System.out.println(Math.min(f[n][1]+n-r[n],f[n][0]+n-l[n]));
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值