hdu 2563(递推)

解题思路:

这道题目要求不能回走,而且每个格子只能走一次,那么我就假定他是往上走的(只能上、左、右),那么前n步里,不能够出现←和→,否则就违反了每个格子只能走一次的规定。

1)假设第n步是↑,那么就很好办,不管怎么走都不会违反规定,共有f(n-1)种;

2)假设第n步是←(以←为例,实际和→的情况一样,到时候乘以2即可),那么第n-1步要么是↑,要么还是←;如果第n-1步是↑,那么就共有2*f(n-1)种。假设是←,那么第n-2步既可能是↑又有可能还是←,.......,直到全部都为←为止,那么推导下来可以得到总的次数为2*(f(n-1)+f(n-2)+f(n-3)+......+f(1)+2),最后的2是有这种情况,第一步是↑,其余全是←,或者全部都是←。

综上,f(n) = f(n-1) + 2*(f(1)+f(2)+......+f(1)+2)

哎,第一次推的时候自己用笔算f(3)漏了一种情况,结果一直怀疑自己的推理过程,最后拿别人的代码测试一下数据,结果还真是我自己笔算的时候漏了一种情况。。。。浪费了好多时间。。


AC:

#include<iostream>
using namespace std;

__int64 f[25];
int main()
{	
	f[1] = 3; f[2] = 7;
	for(int i = 3; i <= 20; i++)
	{
		f[i] = f[i-1] + 4;
		for(int j = i-2; j >= 1; j--)
			f[i] += 2*f[j];
	}
	int t,n;
	cin>>t;
	while(t--)
	{
		cin>>n;
		cout<<f[n]<<endl;
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值