动态规划入门之走线段

P3842 [TJOI2007] 线段 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

动规虐我千百遍,我带动规规如初恋。(所以让我不看题解的写出一道dp吧,求求了)

言归正传,这个题要求我们走完所有线段后在走到(n,n)的最小距离。我们第一时间可能会想到贪心(我就是使用的贪心,在dp里使用贪心实在是太酷啦),大家也许会模拟路线尽量选择最短,但实际上是过不了的,一旦上一条线段的终点正对着下一条线段的某个点时怎么办,所以我们想

dp。我们以一条线段的左端点举例,我们是怎么到达一条线段的左端点的,无非两种选择,从上一条线段的右端点到达,从上一条线段的左端点到达。而从上一条端点往下走的前提条件就是我们已经走完了上一条线段,所以我们才会往下走,如果你不走完上一条线段的话,你不可能往下走。

所以我们的dp的状态就有了。

for(b=2;b<=a;b++) {
	dp[b][0]=Math.min(dp[b-1][1]+length(aa[b][1], aa[b-1][1])+length(aa[b][1], aa[b][0]) ,
			dp[b-1][0]+length(aa[b][1], aa[b-1][0])+length(aa[b][1], aa[b][0]))+1;
    dp[b][1]=Math.min(dp[b-1][1]+length(aa[b][0], aa[b-1][1])+length(aa[b][0], aa[b][1]), 
    		dp[b-1][0]+length(aa[b-1][0], aa[b][0])+length(aa[b][0], aa[b][1]))+1; 
}//我们的dp的定义状态第一位代表着第几行,第二维代表着是左端点还是右端点。整个dp的含义是走完第n行的线段此时在这条线段的最左端或者最右端的最小步数。
我们在走到第n行左端点时,如果我们从n-1行的最左端转移而来,那么我们加上到达n-1行的距离并且加上到达第n行的右端在到达第n行的左端,我们不能直接到达第n行的左段,因为如果我们的上一行的最左端对应下一行的线段的中间某个点时,我们直接到达最左端会没经过最有半部分,所以要这么走,这是个坑

完整代码


import java.awt.FontFormatException;
import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.function.IntToDoubleFunction;
import java.util.function.LongBinaryOperator;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.plaf.ColorChooserUI;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
import javax.xml.crypto.dsig.spec.DigestMethodParameterSpec;
public class Main {
  public static void main(String[] args) throws IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String aString=br1.readLine();
int a=Integer.parseInt(aString);
int b;
dp=new int[a+1][2];
aa=new int[a+1][2];
for(b=1;b<=a;b++) {
	String[] bStrings=br1.readLine().split(" ");
	aa[b][0]=Integer.parseInt(bStrings[0]);
	aa[b][1]=Integer.parseInt(bStrings[1]);
}
dp[1][0]=length(1, aa[1][1])+length(aa[1][1], aa[1][0]);
dp[1][1]=length(1, aa[1][1]);
for(b=2;b<=a;b++) {
	dp[b][0]=Math.min(dp[b-1][1]+length(aa[b][1], aa[b-1][1])+length(aa[b][1], aa[b][0]) ,
			dp[b-1][0]+length(aa[b][1], aa[b-1][0])+length(aa[b][1], aa[b][0]))+1;
    dp[b][1]=Math.min(dp[b-1][1]+length(aa[b][0], aa[b-1][1])+length(aa[b][0], aa[b][1]), 
    		dp[b-1][0]+length(aa[b-1][0], aa[b][0])+length(aa[b][0], aa[b][1]))+1; 
}
System.out.println(Math.min(dp[a][0]+length(aa[a][0], a), dp[a][1]+length(aa[a][1], a)));
  }
public static int[][] aa;
public static int[][] dp;
public static int length(int a,int b) {
	return Math.abs(a-b);
}
 }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值