Sicily 1121 Tri Tiling

  1. Tri Tiling
    Constraints
    Time Limit: 1 secs, Memory Limit: 32 MB
    Description
    In how many ways can you tile a 3xn rectangle with 2x1 dominoes?
  • 3 -
    Here is a sample tiling of a 3x12 rectangle. Input
    Input consists of several test cases followed by a line containing -1. Each test case is a line containing an
    integer 0 ≤ n ≤ 30. Output
    For each test case, output one integer number giving the number of possible tilings. Sample Input
    2
    8
    12
    -1
    Sample Output
    3
    153
    2131
    3*n 的 图 案 的 拼 法 大 致 可 以 分 为 下 面 两 种
    在这里插入图片描述
    对于上图中图案的左半部分如下所示
    在这里插入图片描述
    用一个二维数组 dp[i][j]来表示组成上图中两图案的方法数,设上图中两图形长
    度均为 n,则组成左边的方案数为 dp[n][0]右边的为 dp[n][1]
    则可以得出
  • 10 -
    dp[2][0]=3;
    dp[2][1]=2;
    令上图中左边的图形为图形 1,右边的图形为图形 2
    则对于 3n 的图案可分为两个部分,一个是由 3(n-2)的图案和 32 的图案直接
    拼出来,这部分的方案数为 dp[n-2][0]3,而第二种则是由长度为 n-2,但形状为
    图形 2 所示的图案组合而成,而要注意的是,这个图案在拼装的时候不能组成
    3
    n-2 的图案,因为这种情况在之前已经计算过了,所以就只有一种拼法,所
    以可得状态转移方程 dp[n][0]=dp[n-2][0]3+dp[n-2][1],而对于长度为 n 的图案
    二则有两种拼法,一种是用 3
    (n-2)来拼,由于图案的突出可能在上边也可能在
    下边,所以这样的是 2
    dp[n-2][0],另一种方法是用长度为 n-2 的图案二来拼,
    还是要注意不要拼成 3n-2,所以只有一种拼法,所以可得状态转移方程
    dp[n][1]=2
    dp[i-2][0]+dp[i-2][1],这样的话问题就基本解决了
#include<iostream>
#include<cstring>
using namespace std;
long long int dp[15][2];
int main(){
	int n;
	memset(dp,0,sizeof(dp));
	while(cin>>n&&n!=-1){
		dp[2][0]=3;
		dp[2][1]=2;
		dp[0][0]=1;
		for(int i=3;i<=n;i++){
			if(i%2==1){
				dp[i][0]=0;
				dp[i][1]=0;
			}
			else{
				dp[i][1]=2*dp[i-2][0]+dp[i-2][1];
				dp[i][0]=3*dp[i-2][0]+dp[i-2][1];
			}
		}
		cout<<dp[n][0]<<endl;
		memset(dp,0,sizeof(dp));
	}
}

猜你喜欢

转载自blog.csdn.net/dcy19991116/article/details/89054988
今日推荐