一隻袋鼠要從河這邊跳到河對岸,河很寬,可是河中間打了不少樁子,每隔一米就有一個,每一個樁子上都有一個彈簧,袋鼠跳到彈簧上就能夠跳的更遠。每一個彈簧力量不一樣,用一個數字表明它的力量,若是彈簧力量爲5,就表明袋鼠下一跳最多可以跳5米,若是爲0,就會陷進去沒法繼續跳躍。河流一共N米寬,袋鼠初始位置就在第一個彈簧上面,要跳到最後一個彈簧以後就算過河了,給定每一個彈簧的力量,求袋鼠最少須要多少跳可以到達對岸。若是沒法到達輸出-1 輸入描述: 輸入分兩行,第一行是數組長度N (1 ≤ N ≤ 10000),第二行是每一項的值,用空格分隔。 輸出描述: 輸出最少的跳數,沒法到達輸出-1 示例1 輸入 5 2 0 1 1 1 輸出 #include <iostream>
#include <vector> using namespace std; int getmin(vector<int> s,int n) { vector<int> dp(n+1,99999); dp[0]=1; for(int i =1;i<=n;i++) { for(int j = i-1;j>=0;j--) { if(s[j]==0) { continue; } if(j+s[j]>=i) { dp[i]=min(dp[i],dp[j]+1); } } } if(dp[n]==99999) { return -1; } else return dp[n]-1; } int main() { //思路:1.先記錄最遠能夠跳的位置i,而後從i-1 一直到 起始位置 遍歷的找能夠到達當前位置i的位置 而後取這些能夠到達當前位置的位置的最少跳數+1。在這個過程當中,尋找最小值 int number = 0; cin >> number; vector<int> A(number,0); for(int i =0;i<number;i++) { cin >> A[i]; } int jump = getmin(A,number); cout << jump << endl; return 0; }