题面
分析
只要弄懂每下一层时起点要不是上一层的左端点或者右端点。就是一个简单的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]));
}
}