概述:
在一无限大的二维平面中,我们做如下假设:1、;每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)
思路:
假设目的为向上走,第一步有三种走法,第二步有七种走法,如果最后一步向右走,那么只能是上一步向左走的加上上一步向上走的,设向上走方法为a[i],向左右走为b[i],则dp[i]=a[i]+b[i],b[i]=2*a[i-1]+b[i-1],a[i]=dp[i-1];则可得dp[i]=2*dp[i-1]+dp[i-2].
感想:难想呀难想.
#include <iostream>
using namespace std;
int main()
{
int dp[1000],i;
dp[1]=3;
dp[2]=7;
for(i=3;i<=20;i++)
{
dp[i]=2*dp[i-1]+dp[i-2];
}
int n,m;
cin>>n;
while(n--)
{
cin>>m;
cout<<dp[m]<<endl;
}
return 0;
}