hdu 2501

http://acm.hdu.edu.cn/showproblem.php?pid=2501&PHPSESSID=fme1u1rdulrni3r4tbv5t5e186

递推分析:#include <iostream>

using namespace std;

int main()
{
    int t,n,a[31];
    a[0]=0;
    a[1]=1;
    a[2]=3;
    for(int i=3; i<31; i++)
        a[i]=a[i-1]+2*a[i-2];
    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<a[n]<<endl;
    }
    return 0;
}
/*
假设2*n个空间,已知a[n-1]和a[n-2]。
(1)、先把2*(n-1)放在空间的上方,那么剩余的2*1的空间只能放一个横放的2*1,这里有a[n-1]种
(2)、先把2*(n-2)放在空间的上方,那么剩余的2*2的空间可以放两个横放的2*1,两个竖放的2*1,一个2*2,共3种,但是,注意的是,两个横放的2*1这种情况与(1)的重复,so,只有两种情况符合,这里有2*a[n-2]种
       so,a[n]=a[n-1]+2*a[n-2]
纯属个人理解,有问题可以提出

hdu 2501_第1张图片

 

你可能感兴趣的:(hdu 2501)