Acwing4406.积木画
题目
题目解析及思路
题目要求返回不同的排列方式数量
状压dp,因为每一层放积木最多只会延伸到下一层,因此开f[2][3]
可以维护所有状态
f[i][j]表示前i列填满,且i+1列填了j个的种数
代码
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 1e7+10;
const int mod = 1000000007;
int n;
int f[2][3];
signed main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
cin>>n;
f[1][0] = 1; //一个竖条
f[1][1] = 2; //L型两种放置方式
f[1][2] = 1; //两个横条
for(int i=2;i<=n;i++){
//一个竖条或不放
f[i&1][0] = (f[i-1&1][0] + f[i-1&1][2]) % mod;
//L型或一个横条
f[i&1][1] = (f[i-1&1][0] * 2 + f[i-1&1][1]) % mod;
//两个横条或一个L型
f[i&1][2] = (f[i-1&1][0] + f[i-1&1][1]) % mod;
}
cout<<f[n&1][0]<<endl;
}