最优解法
用二进制[0~7]代表每一列的种花情况。用代表有列且最后一列的种花情况为,通过枚举有列的最后一列花的情况来转移。可以用滚动数组优化空间复杂度。
因为每一列种花情况只有5个状态是有效的,所以总的时间复杂度为,滚动数组优化后只用了一个2*8的辅助数组,空间复杂度可以视为。
int solve(int n){ int mod = 1e9 + 7; int dp[2][8]; memset(dp, 0, sizeof dp); int cur = 0, pre = 1; dp[0][0] = 1; for(int i = 0; i < n; ++i){ swap(cur, pre); for(int j = 0; j < 8; ++j) dp[cur][j] = 0; for(int mask = 0; mask < 8; ++mask){//枚举当前列种花的情况 if(mask == 3 || mask == 6 || mask == 7) continue; for(int t = 0; t < 8; ++t){//枚举上一列种花的情况 if(t == 3 || t == 6 || t == 7) continue; if(mask&t) continue;//如果当前列的花和上一列的花有相邻的情况,则不转移 dp[cur][mask] = (dp[cur][mask] + dp[pre][t])%mod; } } } int ans = 0; for(int i = 0; i < 8; ++i) ans = (ans + dp[cur][i])%mod; return (ans + mod-1)%mod; }