3、铺砖问题

对于一个 2行 N列的走道。现在用1×2,2×2 的砖去铺满。问有多少种不同的方式。

下图是一个 2 行 17 列的走道的某种铺法。

 输入格式

一个数字 N,0≤n≤250。

输出格式

方案数。(对 100007 取模)。

样例输入

8

样例输出

171

解题思路:(递推)

每次铺砖时考虑的情况大致类似,所以可以用递归求解。根据最后剩余的列数,我们将本问题分成两种情况:

a、最后剩余一列,最后这一列的铺砖方式只有一种,故铺n列和铺n-1的情况相同,即方法数为:dp[n-1];

b、最后剩余两列,最后这两列的铺砖方式有三种,1*2横着铺两行,1*2竖着铺两列(与a情况相同,故去掉),2*2直接填满;故方法数为:dp[n-2]*2。

综上所述,dp[n]=dp[n-1]+dp[n-2]*2。

#include <iostream>
using namespace std;
#define MOD 100007
int dp[250];
void solve(int n){
    for(int i=3;i<=n;i++){
        dp[i]=(dp[i-1]+2*dp[i-2])%MOD;
    }
    cout<<dp[n];
}
int main(){
    dp[1]=1;
    dp[2]=3;
    int n;
    cin>>n;
    solve(n);
    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_46027166/article/details/121505801