对于一个 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;
}