题目描述
有 N 级的台阶,你一开始在底部,每次可以向上迈最多 K 级台阶(最少 1 级),问到达第 N 级台阶有多少种不同方式。
输入
多组输入,两个正整数N(N ≤ 1000),K(K ≤ 100)。
输出
一个正整数,为不同方式数,由于答案可能很大,你需要输出 ans mod 100003 后的结果。
样例输入
5 2
样例输出
8
思路:在各种算法书中都有过举台阶问题的例子,每次可以走1步或2步。而这道题是1-k步,那该怎么走呢。1.2步时视数据大小可以用dp或递归来做,进阶了,那就肯定是dp啦。和原例是一样的思想,到达1的位置时一种,dp[1]=1,到达2的位置时2种,dp[2]=2,到达3的时候dp[3]=上一个走2步的位置值+上一个走1步的位置值+1(3步时直达),以此类推,即可推出第n阶的种类数。
在处理方法有两种,一种是用一维数组存储状态,第二种是用二维数组储存状态。实际上是一样的。
二维数组:
#include<stdio.h>
int dp[105][1005];
int main()
{
for(int i=1;i<105;i++)
{
dp[i][0]=1;
}
for(int i=1;i<105;i++)
{
for(int j=1;j<1005;j++)
{
int s=0;
for(int x=1;x<=i;x++)
{
s+=dp[i][j-x];
s=s%100003;
if(x==j)
break;
}
dp[i][j]=s;
}
}
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
printf("%d\n",dp[n][m]);
}
}
一维数组:
#include<stdio.h>
#include<string.h>
long long int dp[1001];
int main()
{
int n,k,i,j;
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[0]=1;dp[1]=1;
for(i=1;i<=n;i++)
{
if(i<=k)
{
dp[i]=1;
for(j=2;j<=i;j++)
{
dp[i]*=2;
}
dp[i]=dp[i]%100003;
}
else
{
for(j=1;j<=k;j++)
{
dp[i]+=dp[i-j]%100003;
}
dp[i]=dp[i]%100003;
}
}
printf("%lld\n",dp[n]);
}
return 0;
}