题目链接:HDOJ1143

每天一个A+B,第34天~


3*n的矩阵之中,用1*2的骨牌将其填满,问总方案数

这个题数据量很小,n最大是30,而且给定了几个值来检验


这种题首先肯定可以确定是数学题,大的数值是由小的数值递推过来

2的时候,是哪3种呢?

其中第一种上下翻转可以得到第三种


4的时候呢,有两种情况,2+2类型的,乘法原理知有3*3=9种

另一种就是4单独构成,有2种

所以有11种


所以可以直接用数学方法先搞出来

这个题,当成排列组合去算
首先分类相加
然后在每个类中,先选定位置,然后乘法原理,除了2是3种情况,其他的数字都是2种
2    3
4    2+2    3*3=9
    4    2
    总共11种
6    2+2+2 3*3*3=27
    2+4 2*3*2=12
    6 2
    总共41种
8    2+2+2+2 3*3*3*3=81
    2+2+4 3*3*3*2=54
    4+4 2*2=4
    2+6 2*3*2=12
    8 2
    总共153种
10     2+2+2+2+2 3*3*3*3*3=243
    2+2+2+4 4*2*3*3*3=216
    2+4+4 3*3*2*2=36
    2+2+6 3*2*3*3=54
    4+6 2*2*2=8
    2+8 2*2*3=12
    10 2
    总共571种
12    2+2+2+2+2+2 3*3*3*3*3*3=729
    2+2+2+2+4 5*2*3*3*3*3=810
    2+2+4+4 6*2*2*3*3=216    C(4,2)
    4+4+4 2*2*2=8
    2+2+2+6 4*3*3*3*2=216
    2+4+6 6*3*2*2=72     A(3,3)
    6+6 2*2=4
    2+2+8 3*2*3*3=54
    4+8 2*2*2=8
    2+10 2*3*2=12
    12 2
    总共2131种
所以根据这些数据去推递推公式
虽然还是不明白为什么了

公式1:
dp[n]=4*dp[n-2]-dp[n-4]
公式2:
dp[n]=3*(dp[n-2]+dp[n-4])-dp[n-6]
其实公式1写两个,dp[n],dp[n-2]
然后叠加就得到了公式2


最后代码很简单的,有没有聚聚能告诉我是怎么推出来公式的

#include<bits/stdc++.h>
using namespace std;

const int maxn=50;
__int64 ans[maxn];

int main(){
	ans[0]=1;
	ans[2]=3;
	ans[4]=11;
	ans[6]=41;
	for(int i=8;i<=30;i++)
		ans[i]=4*ans[i-2]-ans[i-4];
	int n;
	while(scanf("%d",&n),n!=-1){
		if (n%2==0) cout<<ans[n]<<endl;
		else cout<<"0"<<endl;
	}
	return 0;
}