思路:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]:第
i
i
i列状态为
j
j
j的方式数量
每一列积木的状态有三种情况:
0:全铺满
1:上面为空
2:下面为空
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]可以由下列四种转移过来:
(1)
d
p
[
i
−
2
]
[
0
]
dp[i-2][0]
dp[i−2][0]
(2)
d
p
[
i
−
1
]
[
0
]
dp[i-1][0]
dp[i−1][0]
(3)
d
p
[
i
−
1
]
[
1
]
dp[i-1][1]
dp[i−1][1]
(4)
d
p
[
i
−
1
]
[
2
]
dp[i-1][2]
dp[i−1][2]
故:
d
p
[
i
]
[
0
]
=
(
d
p
[
i
−
1
]
[
0
]
+
d
p
[
i
−
2
]
[
0
]
+
d
p
[
i
−
1
]
[
1
]
+
d
p
[
i
−
1
]
[
2
]
)
dp[i][0]=(dp[i-1][0]+dp[i-2][0]+dp[i-1][1]+dp[i-1][2])%mod;
dp[i][0]=(dp[i−1][0]+dp[i−2][0]+dp[i−1][1]+dp[i−1][2])
d
p
[
i
]
[
1
]
dp[i][1]
dp[i][1]可以由下列两种种转移过来:
(1)
d
p
[
i
−
2
]
[
0
]
dp[i-2][0]
dp[i−2][0]
(2)
d
p
[
i
−
1
]
[
2
]
dp[i-1][2]
dp[i−1][2]
故:
d
p
[
i
]
[
1
]
=
(
d
p
[
i
−
2
]
[
0
]
+
d
p
[
i
−
1
]
[
2
]
)
dp[i][1]=(dp[i-2][0]+dp[i-1][2])%mod;
dp[i][1]=(dp[i−2][0]+dp[i−1][2])
d
p
[
i
]
[
2
]
dp[i][2]
dp[i][2]可以由下列两种种转移过来:
(1)
d
p
[
i
−
2
]
[
0
]
dp[i-2][0]
dp[i−2][0]
(2)
d
p
[
i
−
1
]
[
1
]
dp[i-1][1]
dp[i−1][1]
故:
d
p
[
i
]
[
2
]
=
(
d
p
[
i
−
2
]
[
0
]
+
d
p
[
i
−
1
]
[
1
]
)
dp[i][2]=(dp[i-2][0]+dp[i-1][1])%mod
dp[i][2]=(dp[i−2][0]+dp[i−1][1])
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1000000007;
ll n;
ll dp[10000002][3];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
/*
0 满
1 上空
2 下空
*/
dp[0][0]=1;
dp[1][0]=1;
for(int i=2;i<=n;i++)
{
dp[i][0]=(dp[i-1][0]+dp[i-2][0]+dp[i-1][1]+dp[i-1][2])%mod;
dp[i][1]=(dp[i-2][0]+dp[i-1][2])%mod;
dp[i][2]=(dp[i-2][0]+dp[i-1][1])%mod;
}
cout<<dp[n][0];
return 0;
}