题意:给定一个数字串 (均为正整数),现在需要从第一个数跳跃到最后一个,所在位置的数字表示可以跳跃的最大步数。求出从第一个位置跳跃到最后位置所需的最少步数。
输入要求:一个数字串,每个数字用空格隔开。
举例: 输入 1 2 3 4 5 6 7。需要从第一位 1 跳到最后一位 7,则 1->2->4->7,最少需要3步 。
思路: 贪心策略,要想步骤最少。需在每次选择从当前位置跳到其他位置时,选取规则是其他位置的最大跳跃距离与终点最近。方法是 :从起点开始,找到第一个可以一步到达终点的位置。把刚刚找到的位置作为新的终点,重复上一步。直到新的终点和起点重合。
代码:
/**
@ MIOJ_跳跳看_动规
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 63355;
int f[maxn];
char buf[maxn];
int n;
/**
"跨度大,步骤少"
从起点开始,找到第一个可以一步到达终点的位置;
把刚刚找到的位置作为新的终点,重复上一步;
直到新的终点和起点重合
*/
bool read(){
if(gets(buf)) {
char *p = strtok(buf," ");
int v;
while(p){
sscanf(p,"%d",&v);
f[n++] = v;
p = strtok(NULL," ");
}
return true;
}else return false;
}
int minCost(int end){
if(!end) return 0;
else {
int i = 0;
while(f[i]<end-i){ //优化的是从终点一直遍历到起点找到可以一步到达终点的点(即能一步到达终点且距离终点最远的点)
i++;
}
return 1+minCost(i);
}
}
int main(){
while(read()){
cout<<minCost(n-1);
n = 0;
}
return 0;
}
结果:
![]()
4089

被折叠的 条评论
为什么被折叠?



