題目:一只袋鼠要從河這邊跳到河對岸,河很寬,但是河中間打了很多樁子,每隔一米就有一個,每個樁子上都有一個彈簧,袋鼠跳到彈簧上就可以跳的更遠,每個彈簧力量不同,用一個數字代表它的力量,如果彈簧力量為5,就代表袋鼠下一跳最多能夠跳5米,如果為0,就會陷進去無法繼續跳躍,河流一共N米寬,袋鼠初始位置就在第一個彈簧上面,要跳到最后一個彈簧之后就算過河了,給定每個彈簧的力量,求袋鼠最少需要多少跳能夠到達對岸。如果無法到達輸出-1;
輸入:輸入分兩行,第一行是數組長度N,第二行是每一項的值,用空格分隔;
輸出:輸出最少的跳數,無法到達輸出-1;
樣例輸入
5
2 0 1 1 1
思路:定義dp[i] 表示到達i米的時候需要的最少跳,定義v[i] 表示在之前的跳中能否到達i,狀態轉移如下,把從當前位置能到達的樁子全計算dp[];
for(int j=i+1;j<=a[i]+i;j++)
{
if(v[i]&&!v[j]) dp[j]=dp[i]+1,v[j]=1; }
代碼如下:
#include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <set> #include <queue> #include <vector> using namespace std; int a[100005]; int dp[100005]; int v[100005]; int main() { int N; while(scanf("%d",&N)!=EOF) { for(int i=1;i<=N;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); memset(v,0,sizeof(v)); dp[1]=0; v[1]=1; for(int i=2;i<=1+a[1];i++) { dp[i]=1; v[i]=1; } for(int i=2;i<=N;i++) { if(a[i]==0) continue; for(int j=i+1;j<=a[i]+i;j++) { if(v[i]&&!v[j]) dp[j]=dp[i]+1,v[j]=1; } } if(v[N+1]) cout<<dp[N+1]<<endl; else cout<<"-1"<<endl; } return 0; }