袋鼠过河 dp

 

题目:一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远,每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为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 }

 

posted @ 2018-07-21 11:48  木流牛马  阅读(224)  评论(0编辑  收藏  举报