hd 1143

显然n为奇数无解。n为偶数开始讨论。

step1.先从一个3*N的矩形里切出一个最小的可以用1*2矩形组成的3*2的矩形,即分成2和n-2两段长度,对这种情况来说有f(2)*f(n-2)种拼接方法(左边小矩形三种,右边f(n-2)种)。显然f(n-2*i)代表的是一块长度为n-2i的不能被划分出一个完整的3*2k(k<=i)的矩形的满足题意的方法总数。

即 3*f(n-2)时 f(n-2)中不能再划分出一个完整的3*2  f(4)*f(n-4)时 f(n-4)种不能再划分出一个完整的3*2或3*4的矩形。

或者说不可以再用竖线切分出一个小矩形。

step2.通过画图可以发现切出的2*i长度的矩形只能有2种情况,不能有原来那样有三种。(不可以再用竖线切分,反复执行这个原则

所以之后的都是2*巴拉巴拉

 

所以递推式是f(n)=f(2)*f(n-2)+2*[f(n-4)+f(n-6)+f(n-8)+……+f(0)]。

写出f(n-2)之后两式相减,得f(n)=4*f(n-2)-f(n-4)。

代码如下

#include <iostream>
#include <cstring>
using namespace std;
int dp[35];
int f(int n)
{
    if(!dp[n])
    {
        dp[n]=4*f(n-2)-f(n-4);
    }
    return dp[n];
}
int main()
{
    int n;
    memset(dp,0,sizeof(dp));
    dp[0]=1;
    dp[2]=3;
    while(cin>>n)
    {
        if(n==-1) break;
        if(n&1)
            cout<<"0"<<endl;
        else
            cout<<f(n)<<endl;
    }
    return 0;
}

 

你可能感兴趣的:(hd 1143)