一座長度爲n的橋,起點的一端座標爲0,且在整數座標i處有a[i]個石頭【0<=a[i]<=4】, 一隻青蛙從座標0處開始起跳,一步可以跳的距離爲1或2或3【即每一步都會落在整數點處】, 青蛙落在i處會踩着該點的所有石頭,求青蛙跳出這座橋最少踩多少個石頭?並且輸出依次跳 過的座標點路線,如果存在多種路線,輸出字典序最小的那一條。
輸入格式:
第一行整數n(<150000),接着下一行會有n+1個由空格隔開的整數,即橋上各個座標處石頭數量。
輸出格式:
第一行爲踩着最少石頭個數,第二行爲依次跳過的座標點【字典序最小的】。
輸入樣例:
在這裏給出兩組輸入。例如:
10
1 2 1 3 0 3 1 2 1 1 2
100
1 2 0 4 0 1 3 4 2 2 1 3 1 4 0 3 0 1 2 3 3 2 2 0 1 0 0 0 0 1 2 1 3 4 0 3 4 4 1 0
4 1 3 1 1 2 3 4 4 4 0 2 0 1 1 1 3 1 3 2 1 2 4 1 2 1 4 1 0 0 1 2 3 0 2 4 4 0 0 4
2 0 0 2 1 3 3 3 0 0 2 0 0 1 2 4 2 2 2 4 0
輸出樣例:
在這裏給出對應的輸出。例如:
4
0 2 4 6 8
36
0 2 4 5 8 10 12 14 16 17 20 23 25 26 27 28 31 34 35 38 39 41 44 47 50 52 54 57 60 63 65 68 69 70 73 74 77 78 81 82 85 88 89 91 92 94 97 100
代碼如下(動態規劃):
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt()+1;
int[] stone = new int[n+1];
int[][] step = new int[n+1][2];
for(int i=0;i<n;i++)
stone[i] = sc.nextInt();
step[0][1] = stone[0];
for(int i=1;i<=n;i++) {
//判斷要踩哪塊石頭
int tmp = i-1;
if(i-2>=0 && step[tmp][1]>=step[i-2][1])
tmp = i-2;
if(i-3>=0 && step[tmp][1]>=step[i-3][1])
tmp = i-3;
//順次判斷是否有某處石頭數爲0,有則必須踩才能保證字典序最小,只針對此題
if(stone[i-1]==0 && step[tmp][1] == step[i-1][1])
tmp = i-1;
else if(i-2>=0 && stone[i-2]==0 && step[tmp][1] == step[i-2][1])
tmp = i-2;
else if(i-3>=0 && stone[i-3]==0 && step[tmp][1] == step[i-3][1])
tmp = i-3;
step[i][0] = tmp;
step[i][1] = step[tmp][1]+stone[i];
}
System.out.println(step[n][1]);
recursion(n, step);
}
public static void recursion(int n, int[][] step) {
if(step[n][0]!=0) {
recursion(step[n][0], step);
System.out.print(" "+ step[n][0]);
}
else {
System.out.print(step[n][0]);
}
}
}
這個題目我是用動態規劃做的,其實感覺也是用動態規劃最簡單,思路是:由於青蛙最多隻能跳三步,所以選擇距離它要到達位置的前面三個位置中最小的位置起跳。如果說只統計最少踩的石頭數那麼我的代碼沒什麼問題,但是這個題目還要求字典序最小的輸出座標點,這個我就沒理解明白什麼是最小的字典序,提供的五個測試點只對了三個,代碼僅供參考,如果有大佬看出我代碼中的錯誤請幫我指出,謝謝!