Java

Owll 发表于 1年前 · 关联问题 信号中转

题目:信号中转

思路:动态规划

  1. 对于每一个点,信号必然是从前面的某一个点传输来的。如果当前点在前面某些点的传输范围内,那么当前点的最短中转次数等于前面那些点的最小中转次数+1
  2. 从前往后遍历,更新从当前点传输到后面点的距离(该点在当前点的传输范围内)

代码如下:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; public class Main { //快速输入 static BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //快速输出 static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out)); static int mod=1_000_000_007; public static void main(String[] args) throws IOException { String[] s=br.readLine().split(" "); int n=Integer.parseInt(s[0]); int[] a=new int[n]; s=br.readLine().split(" "); for(int i=0;i<n;i++) { a[i]=Integer.parseInt(s[i]); } int[] dp=new int[n]; int flag=Integer.MAX_VALUE; Arrays.fill(dp, flag); dp[0]=0; for(int i=0;i<n;i++) { if(dp[i]==flag) { continue; } for(int j=i+1;j<n&&j-i<=a[i];j++) { dp[j]=Math.min(dp[j], dp[i]+1); } } pw.println(dp[n-1]); pw.flush(); } }