骨牌铺法--递归思路

题目描述
有1×n的一个长方形,用一个1×1、1×2和1×3的骨牌铺满方格。例如当n=3时为1×3的方格。此时用1×1、1×2和1×3的骨牌铺满方格,共有四种铺法。如图所示。

在这里插入图片描述

输入
输入n(n为自然数,并且1≤n≤30)

输出
输出骨牌铺法的方案数。

样例输入 Copy
3
样例输出 Copy
4

思路:设1*n时有F(n)种排法;

F(1)有1种;F(2)有2种;F(3)有4种;

n为4的时候,方法数F4的分析如下:

第一块放11,有一种方法;剩余3块方法数是F3=4种。根据乘法原理,该种情况的方法数是14=4。

第一块放12,有一种方法;剩余2块方法数是F2=2种。根据乘法原理,该种情况的方法数是12=2.

第一块放13,有一种方法;剩余1块方法数是F1=1种。该种情况方法数是11=1.

根据分类原理,F4=4+2+1=7种。

……

故n>=4的时候,Fn=Fn-1+Fn-2+Fn-3

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin >> n;
	int cnt[50]={0,1,2,4};
	for(int i=4;i<=n;i++){
		cnt[i]=cnt[i-1]+cnt[i-2]+cnt[i-3];
	}
	cout << cnt[n] << endl;
	return 0;
} 

#include<iostream>//慢 
#include<bits/stdc++.h>
using namespace std;
int bone(int n){
	if(n==1) return 1;
	if(n==2) return 2;
	if(n==3) return 4;
	else return bone(n-1)+bone(n-2)+bone(n-3);
}
int main(){
	int n;
	cin >> n;
	cout << bone(n) << endl;
	return 0;
}
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值