• C语言编程练习15:贴瓷砖


    题目描述

    有一块大小是 2 * n 的墙面,现在需要用2种规格的瓷砖铺满,瓷砖规格分别是 2 * 1 和 2 * 2,请计算一共有多少种铺设的方法。

    输入

    输入的第一行包含一个正整数T(T<=20),表示一共有T组数据,接着是T行数据,每行包含一个正整数N(N<=30),表示墙面的大小是2行N列。

    输出

    输出一共有多少种铺设的方法,每组数据的输出占一行。

    样例输入 Copy

    3
    2
    8
    12

    样例输出 Copy

    3
    171
    2731

    思路:这是一道递归题,主要要找到递归规律,但是我笨!我找不到
    参考:https://www.jianshu.com/p/253d948b2bb3
    动态规划法,但是我输出超限了:https://blog.csdn.net/weixin_43207025/article/details/89602338

    做递归题目时,通常做法都是先看特殊情况与终止条件,再找递推公式。这道题很明显,当n=1是终止条件,n=2时候是特殊情况,原因是有两种规格的瓷砖,当n=1推到n=2时候需要考虑到有2*2规格的瓷砖,而当n>2时候,观察一下增加一列如何求得铺的地砖,我的想法是,增加一列有分两种情况,若是之前铺瓷砖的方法不变,那铺设的方法就是f(n-1),第二种情况之前的铺瓷砖的方式进行改变,如果是改两块瓷砖的铺设方法,那么就是f(n-2),而如果是一个2*2的墙面,你可以用两种方法,一种是横着放两块瓷砖,一种是直接放一块2*2的瓷砖,注意 这里不是三种方法,因为直接竖着放两块瓷砖的方法其实是属于第一种情况的。

    因此f(n-2)是需要乘2的,若是改三块瓷砖的铺设方法,那显然可以由之前的递归所得到。
    因此递归公式就是 f(n)=f(n-1)+f(n-2)*2

    #include <stdio.h>
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int f(int x)
    {
    	if(x==1)
    	{
    		return 1;
    	}
    	if(x==2)
    	{
    		return 3;
    	}
    	return f(x-1)+2*f(x-2);//知道这个规律那还不简单?
    }
    int main()
    {
    	int n;
    	cin >> n;
    	while(n--)
    	{
    		int m;
    		cin >> m;
    		cout << f(m) <<endl;
    			
    	}
        return 0;
    }
    
  • 相关阅读:
    【ES6】函数的扩展
    NSFileManger使用介绍
    委托,曾将让我头疼难以理解
    【HDOJ】1914 The Stable Marriage Problem
    MySQL修改配置优化插入性能
    MySQL配置文件的编码问题
    MyBatis批量更新时提示"You have an error in your SQL syntax"
    MyBatis批量更新返回受影响数
    log4j.properties配置说明
    删除Win10的OneDrive
  • 原文地址:https://www.cnblogs.com/FantasticDoubleFish/p/14315356.html
Copyright © 2020-2023  润新知