动态规划
如果河宽0米,最少需要f[0]跳,显然f[0]=0;
如果河宽1米,最少需要f[1]跳,那么如果0+a[0]>=1,那么就可以跳过去,f[1]=f[0]+1,也就是说到达0的跳数加上从0跳到1的一步。
如果河宽2米,最少需要f[2]跳,这里怎样跳,有两种选择,一是从0开始跳(0+a[0]>=2即可),二是从1开始跳(1+a[1]>=2即可),那么从0开始跳,f[2]=f[0]+1;从1开始跳,f[2]=f[1]+1。然后选取其中最小的。
如果河宽3米,那么我有三种选择,从0、1、2开始跳……
#include <iostream>
using namespace std;
int main(void)
{
int n;
cin >> n;
int* spring = new int[n]; //记录各个弹簧的力量
for (int i = 0; i < n; i++)
cin >> spring[i];
int* f = new int[n + 1]; //f[i]代表跳到i米需要的最小步数,i = 0, 1, ..., n
f[0] = 0;
int min;
for (int i = 1; i <= n; i++)
{
min = 999;
for (int j = 0; j < i; j++) //找出跳到i米最少需要多少步
{
if (j + spring[j] >= i && f[j] + 1 < min) //如果从j米处跳,并且j加上j米处的弹簧力量大于等于i,并且跳到j米的最小步数加上这一步小于min
{
min = f[j] + 1;
}
}
f[i] = min;
}
cout << f[n] << endl;
return 0;
}
运行结果