- 题目链接
- 分析:这道题属于01背包问题的变形。
- 状态转移方程:
dp[j]=min(dp[j],dp[i]+1);
其中j为跳跃的数,同时这道题注意跳跃会超出范围,所以需要注意数组越界问题。 - 初始化:
vector<int> dp(n+1,N); dp[0]=0;
分析初始化的合法状态,只有dp[0]才是合法状态,其他的都是非法状态,属于未定义状态。后面的状态只有从dp[0]迭代出来的,才是合法状态。 - 参考代码:
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int main()
{
int i,j;
int n,x;
cin>>n;
vector<int> vec;
vector<int> dp(n+1,N);
dp[0]=0;
for(i=0;i<n;i++){
cin>>x;
vec.push_back(x);
}
for(i=0;i<n;i++){
if(vec.at(i)!=0){
for(j=i+vec.at(i);j>i;j--){
if(j>=n)
dp[n]=min(dp[n],dp[i]+1);
else if(vec.at(j)!=0)
dp[j]=min(dp[j],dp[i]+1);
}
}
}
if(dp.at(n)>=N) cout<<"-1";
else cout<<dp[n];
return 0;
}