P1192 台阶问题

1.问题

见题目

2.分析

  • 具有子问题特性,需分治(递归)解决
  • 类似Fibonacci数列问题
  • 建立适当的递推式即可
  • 需要在适当的地方运用数论的知识 [(a+b) mod n =((a mod n)+(b mod n)) mod n ]

3.代码

#include<iostream>
using namespace std;

const int maxN = 100005;
typedef long long ll;
int k ;
ll f[maxN];

//n级台阶需要迈的次数 
int cal(int n){
	if(n==1 || n==0)
		return f[n];
		
	//可以选择迈1-k步 
	//注意i的取值范围,这个很关键 
	for(int i = 1;i<=k && i<=n;i++){		
		if(f[n-i]!=0)
			f[n] += f[n-i];
		else
			f[n] = f[n] + cal(n-i);
		f[n] = f[n] % 100003;
	}
	return f[n]; 
}

int main(){
	int n;
	cin >> n>> k;
	fill(f,f+maxN,0);
	f[0] = f[1] = 1;
	cal(n);
	cout << f[n] % 100003;
}