题目使用动态规划解法,定义dp[i]为跳到第i个木桩所需要的最小步数,但题中有几个坑,首先,i的范围为0~n,且初始位置为第一个弹簧,即第初始位置步数为0,dp[0]=0,输出的解为dp[n+1]位置的步数,因为过完这些木桩才算完成。且dp数组必须先初始化为n+1个很大的数,不初始化的话,min函数则失去了作用,dp[i]一开始存的若是一个很小的数,则数组不会进行更新。代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
vector<int> num(n,0);
for (int i = 0; i < n; i++)
cin >> num[i];
vector<int> dp(n + 1, 10000); //dp初始化
dp[0] = 0;
for (int i = 1; i <=n; i++) //dp[n]表示岸边,非最后一个桩
{
for (int j = i - 1; j >= 0; j--)
{
if (num[j] == 0)
continue;
if (j + num[j] >= i) // j + num[j] >= i 表示从j未知能跳到i位置
dp[i] = min(dp[i], dp[j] + 1); //更新dp[i]
}
}
if (dp[n] == 10000)
cout<<"-1" ;
else
cout<<dp[n];
return 0;
}