袋鼠过河 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 }