输入分两行,第一行是数组长度N (1 ≤ N ≤ 10000),第二行是每一项的值,用空格分隔。
输出最少的跳数,无法到达输出-1
5 2 0 1 1 1
4
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Scanner; 4 /** 5 * 6 * 袋鼠过河(最多跳弹簧的步数) 用 list 来模拟dp数组 list存每一行,横坐标为 各个弹簧的到达情况 未到达为0 到达为1 到达此处陷入为0 7 * 8 * @author Dell 9 * 10 */ 11 public class Main { 12 static List<int[]> dp = new ArrayList(); 13 static int n; 14 static int[] is; 15 16 static int f() { 17 // 站在第一个弹簧上时 18 int step = 0; 19 int x = 0; 20 int[] s = new int[n + 1]; 21 for (int j = 0; j < s.length; j++) { 22 s[j] = 0; 23 } 24 s[0] = 1; 25 dp.add(s); 26 while (step <= n) {// 所有行 27 int[] ss = new int[n + 1];// 多出来的最后一位表示岸上 28 for (int j = 0; j < ss.length; j++) { 29 ss[j] = 0; 30 } 31 // 每一行 根据本行填写下一行 32 for (int i = step; i < ss.length; i++) {// 多出来的最后一位表示岸上 33 // 位置 i已到达 34 if (dp.get(dp.size() - 1)[i] == 1) { 35 // 走不同的步数 36 for (int j = 1; j <= is[i]; j++) { 37 // 判断不可超出弹簧范围一个一,下标要多减,若超出则选岸上为1 38 if (i + j <= ss.length-2) { 39 // 在范围内 新位置 不是0 不会陷 访问 40 if (is[i + j] > 0) { 41 ss[i + j] = 1; 42 } 43 } else { 44 // 超出则选最后一个为1 45 ss[ss.length - 1] = 1; 46 } 47 } 48 } 49 } 50 dp.add(ss); 51 52 step++; 53 if (dp.get(dp.size()-1)[ss.length - 1] == 1) {// 岸上访问到 54 return step; 55 } 56 } 57 return -1; 58 } 59 public static void main(String[] args) { 60 Scanner sc = new Scanner(System.in); 61 n = sc.nextInt(); 62 is = new int[n]; 63 for (int i = 0; i < is.length; i++) { 64 is[i] = sc.nextInt(); 65 } 66 int res = f(); 67 System.out.println(res); 68 } 69 }
原文:https://www.cnblogs.com/the-wang/p/8981592.html