爬楼梯——递推法(一维、多维、图)

一、一维递推

有一个n层的楼梯,每次只能上一层或上两层,那么爬到n层有多少种方法?
分析:类比于递归,现层到达为下面一层和下面两层的和。
故递推关系式为F(n)=F(n-1)+F(n-2)
即代码表达为

/**低空间**/
int a=1,b=2,c;
for(i--n)//n为次数
{
	c=a+b;
	a=b;
    b=c;
}

/**常用**/
int f[3];//此题为3,3个变量
f[0]=1,f[1]=2;
for (i=2--n)
	f[i%3]=f[(i-1)%3]+f[(i-2)%3];
//利用的是数组滚动,DP方法中常见

二、多维递归

小明走路,仅能 向上、向下、向前走,并且走过后不能再走,则小明走n步有多少种走法?
分析:从点考虑,小明在n处的选择取决于n-1处的选择,
从面考虑,设小明的第n次选择为小明所走路径数的层数,
按照数节点的计算,n+1的节点数为 n的选择路的子路总和
F(m)=f[0]+f[1]+f[2] //其中f函数为上一次的选择数
现在利用二维函数进行优化

/**二维数组模拟**/
int ans[100][3]={0};
ans[0][1]=ans[0][1]=ans[0][2]=1;
for (i=1--n)
{
	ans[i][0]=ans[i-1][0]+ans[i-1][2];//想在n向上 则n-1必不能向下 即ans[i-1][1]=0
    ans[i][1]=ans[i-1][1]+ans[i-1][2];//同上 ans[i-1][0]=0
	ans[i][2]=ans[i-1][0]+ans[i-1][1]+ans[i-1][2];
}
cout<<ans[i-1][0]+ans[i-1][1]+ans[i-1][2]<<endl;

/**一维递推**/
int ans[3];//此题为3个变量
ans[0]=ans[1]=1;
for (i=2--n)
	ans[i%3]=2*ans[(i-1)%3]+ans[(i-2)%3];
//等式推导

三、图递推

在XY数轴中,到达(x,y)有多少种方法?
分析:利用爬楼梯思路
F(x,y)=F(x-1)(y)+F(x)(y-1)

int F[100][100]={0};
F[0][0]=1;
for ()
{
	for ()
	{
		if (i未越界)
			F[i][j]+=F[i-1][j];
		if (j未越界)
			F[i][j]+=F[i][j-1];
	}
}

数学思路:从总路程中选择向前走的数量
F(x,y)=C(x-1,x+y-2)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值