台阶问题(进阶版)

题目描述

有 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;
}

猜你喜欢

转载自blog.csdn.net/pleasantly1/article/details/81274155