积木画
#include<iostream>
#include<cstring>
using namespace std;
bool st[4][4] = {
{1,1,1,1},
{0,0,1,1},
{0,1,0,1},
{1,0,0,0},
};
const int mod = 1000000007;
int main()
{
int N;
cin >> N;
int f[N+5][4];
memset(f,0,sizeof f);
f[1][0] = 1;
for(int i=1;i<=N+1;i++)
{
for(int j=0;j<4;j++)
{
for(int k=0;k<4;k++)
{
// f[i-1][k] —— > f[i][j]
f[i][j] = (f[i][j]+f[i-1][k]*st[k][j]) % mod;
}
}
}
cout << f[N+1][0] << endl;
return 0;
}
分析:
状态压缩dp
没做出来原因:
就是单纯的不会,然后去补了蒙特里安的梦想同样也是状态压缩的dp,还是不会,然后去看题解了。现在写完还是有点不会。
看还有其他简单的做法,没看,后面还有滚动数组优化也没看,害。
其他:
看完状态压缩dp和拿蒙特里安的梦想作为例题,然后套着思路做,然后错了。后面想了想,总结以下几点
1.思路是没错的,同样状态压缩+转移。造成不一样的原因是我自己转移的过程没弄清楚,两道题有些地方还是不一样的。
2.蒙特里安的梦想压缩1和0和这道题有些许区别,而且这道题可以直接用4*4的矩阵表示转移。