您的位置:首页 > 其它

HDOJ1143 Tri Tiling

2016-06-07 09:33 211 查看
题目链接: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
=4*dp[n-2]-dp[n-4]

公式2:

dp
=3*(dp[n-2]+dp[n-4])-dp[n-6]

其实公式1写两个,dp
,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
<<endl;
else cout<<"0"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm