【51Nod 1142】棋子遍历棋盘 矩阵快速幂+插头DP

博客探讨了如何使用矩阵快速幂优化解决51Nod 1142题目的棋子遍历棋盘问题。文章指出,由于行间的转移相似,可以将状态转移用矩阵表示并进行快速幂运算。不过,由于最后一行有特殊转移,需要单独处理。作者表达了对这种方法的神秘感,并提供了相关代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题走这里
从数据范围可以看出是矩阵快速幂优化

由于这种插头DP各行之间的转移是十(yi)分(mu)相(yi)似(yang)的。
我们可以用矩阵来描述d[i][m][1…S]到d[i+1][m][1…S]的转移。
算出每一个d[i][m][1…S]对每一个d[i+1][m][1…S]的贡献,储存在矩阵里。
做一次矩阵乘法就相当于完成了一行的转移,快速幂即可。
但是最后一步由于插头dp最后一格有特殊转移,矩阵快速幂只能做到m-1行,所以最后一行要特殊处理。

就是这样,感觉好玄学啊

代码如下:

#include <bits/stdc++.h>
#define LL long long
#define MOD 1000000007
using namespace std;
LL n,m,H[2500],s,S,d[2][2500];//S横截线的状态数 
map<LL,LL> IH;
struct Matrix
{
    LL a[25][25];
    inline friend Matrix operator*(const Matrix &m1,const Matrix &m2)
    {
        Matrix m3;
        for(int i=0;i<S;i++)
        {
            for(int j=0;j<S;j++)
            {
                for(int k=0;k<S;k++)
                {
                    (m3.a[i][j]+=m1.a[i][k]*m2.a[k][j])%=MOD;   
                }
            }
        }
        return m3;
    }
    Matrix()
    {
        mem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值