2046 骨牌铺方格(简单的推断题)

题目

Problem Description
在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:
在这里插入图片描述

Input
输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0<n<=50)。

Output
对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。

Sample Input
1 3 2

Sample Output
1 3 2


思路

一种思路是使用递推

假设dp[i]表示 2 x i 规格的长方形方格的放置方法总数,那么显然dp[1] = 1, dp[2] = 2。在 dp[1] 和 dp[2] 的基础上可以推出dp[3],因为dp[3]无非就是在dp[1]所包含的放置方式后面再加上两块横着放的骨牌,或者是在dp[2]所包含的情况后面加上一块竖着放的骨牌。

假设我们知道了dp[i - 1]和dp[i - 2],现在要求dp[i],
dp[i]可以理解成,

  • 在dp[i - 1]表示的长方形方格后加上一块2 x 1的方格。对于这种情况,只能竖着放一块骨牌。
  • 或是在dp[i - 2]表示的长方形方格后加上一块2 x 2的方格后加上一块2 x 2的方格。对于这种情况,只能横着放两块骨牌。


示意图来自https://blog.csdn.net/lishuhuakai/article/details/8531214,侵删


编码(C语言)

#include<stdio.h>

long long dp[50];

int main(){
	int n = 0;
	dp[1] = 1, dp[2] = 2;
	for(int i = 3; i <= 50; i++){
		dp[i] = dp[i - 1] + dp[i - 2];
	}
	
	while(scanf("%d", &n) != EOF){
		printf("%lld\n", dp[n]);
	}	
	
	return 0;
}
发布了38 篇原创文章 · 获赞 5 · 访问量 6572

猜你喜欢

转载自blog.csdn.net/shaotianyang12/article/details/94600731