CSDN-楼梯问题

/*
form CSDN:
假设楼梯有M节,一个人一不最多跨过N节,问有多少中方法(请给出代码)

如M = 4, N = 2;
则有5种方法(1,1,1,1) ;(1,1,2);(1,2,1);(2,1,1);(2,2)

TheBadTouch(iamsleepy - 一睡不醒) 给出了一个很不错的解法:

#include < stdio.h>
#include < memory.h>
#define min(A,B) (A< B?A:B)
#define max(A,B) (A> B?A:B)

typedef unsigned __int64  int64;//自己根据编译器改,gcc就是unsigned long long

int main(){
   int64 f[1025]; //最多一次阶梯这里1024啦(m< 1025)
   memset(f,0,sizeof(f));
   f[0]=1;
   int i,j,m,n;
   scanf("%d%d",&m,&n);
   for(i=1;i< =m;i++)
     for(j=1;j< =min(i,n);j++)
        f[i]+=f[max(0,i-n+j-1)];
   printf("%I64u/n",f[m]);
   return 0;
}

我的解法和上面的解法算法思路是一样的,我感觉我的更容易被看懂 :-)
我将公式:f(m)=f(m-1)+f(m-2)+...+f(m-n) 做了一下简化:
f(m)=2f(m-1)-f(m-n-1)这样子递归就很方便了。
*/


#include <stdio.h>
#include <stdlib.h>

int way(int num,int step)
{
if (num<0) return 0;
if (num==0||num==1) return 1;
return 2*way(num-1,step)-way(num-(step+1),step);
}

int main(int argc,char *argv[])
{
int m,n;
if (argc!=3)
   {
   printf("usage : way [num] [step]/n");
   exit(-1);
   }
m=atoi(argv[1]);
n=atoi(argv[2]);
printf("there has %d way to up to the stair/n",way(m,n));
getchar();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值