1016 Problem P
题意:一无限大的二维平面中,我们做如下假设: 1、每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
思路:令f[n]表示走n步的方案数,x[n]表示向下走的方案数,z[n]表示向左右走的方案数;所以 f[n]=x[n]+z[n];
x[n]=x[n-1]+z[n-1];
z[n]=x[n-1]*2+z[n-1];
所以f[n]=2*f[n-1]+x[n-1]===>f[n]=2*f[n-1]+f[n-2]。
感想:思考问题太过片面了,一开始看到题,直接从最小步数开始列举,自认为得到规律后,就写出来代码,可就是不对,后来无奈看了题解。还是递推,第n步与之前的走法有关,必须要用到前面的数据。总之,还是应深入的去看问题,避免盲目。
#include<iostream>
using namespace std;
int main(){
int c,n,i;
long long f[22];
f[1]=3; f[2]=7;
for(i=3;i<=20;i++)
f[i]=2*f[i-1]+f[i-2];
cin>>c;
while(c--){
cin>>n;
cout<<f[n]<<endl;
}
return 0;
}