1. 程式人生 > >袋鼠過河 dp

袋鼠過河 dp

輸出 second 有一個 set math first name names namespace

題目:一只袋鼠要從河這邊跳到河對岸,河很寬,但是河中間打了很多樁子,每隔一米就有一個,每個樁子上都有一個彈簧,袋鼠跳到彈簧上就可以跳的更遠,每個彈簧力量不同,用一個數字代表它的力量,如果彈簧力量為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; }

 1 #include<iostream>
 2 #include<cstdio>
 3 #include <cctype>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<string>
 8 #include<cmath>
 9
#include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const int INF= 0x3f3f3f3f; 20 const int N=1e5+5;
21 22 int dp[N],vis[N],a[N]; 23 int n; 24 25 int main() 26 { 27 cin>>n; 28 for(int i=1;i<=n;i++) cin>>a[i]; 29 if(a[1]==0){ 30 cout<<-1; return 0; 31 } 32 for(int i=1;i<=1+a[1] ;i++){ 33 dp[i]=1; vis[i]=1; 34 } 35 36 for(int i=2;i<=n;i++) 37 { 38 if(a[i]==0) continue; 39 for(int j=i+1;j<=i+a[i] ;j++) 40 { 41 if( vis[i] && !vis[j]){ 42 dp[j]=dp[i]+1; 43 vis[j]=1; 44 } 45 } 46 } 47 if(vis[n+1]) cout<<dp[n+1]; 48 else cout<<-1; 49 }

袋鼠過河 dp