积木画(状态压缩dp)

积木画

#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的矩阵表示转移。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值