题目
现在n个弹簧板,小球从第i个弹簧板落下,可以向前弹a[i-1]个距离或者b[i-1]个距离,现在从第一个弹簧板落下,计算弹多少次,弹出弹簧板。(1≤n≤200),(0<a[i],b[i]≤30)(1 \leq n \leq 200),(0 < a[i],b[i]\leq 30 )(1≤n≤200),(0<a[i],b[i]≤30)
样例输入:
5
2 2 3 1 2
1 2 3 4 1
样例输出:
2
样例输入:
5
3 2 2 2 2
1 5 6 7 8
样例输出:
2
分析与解答
c(x)意味着从下标为x到下标变化到>n-1需要几次
弹出意味着下标>n-1。此时弹出弹簧板需要零次。
否则,弹出弹簧版需要min(c(x+a[x]),c(x+b[x]))+1次。
因为从下一个板一的下标定是x+a[x]或者x+b[x],那么只需找下个板到弹出所需最小次数,再加上次到这一个板弹的那一次即可。这就是一个递推式,c(x)=min(c(x+a[x]),c(x+b[x]))+1
#include<iostream>
#include<algorithm>
using namespace std;
int a[300];
int b[300];
int n;
int c(int x){if(x>=n) return 0;else return min(c(x+a[x]),c(x+b[x]))+1;
}
int main(){cin>>n;for(int i=0;i<n;++i){cin>>a[i];}for(int i=0;i<n;++i){cin>>b[i];}cout<<c(0);
}