洛谷P3758 - [TJOI2017]可乐

本文介绍了一种使用矩阵乘法优化动态规划的方法,解决在一个有限的无向图中,可乐机器人在特定时间内可能采取的行动方案数量问题。通过构建包含自环和自爆状态的有向图,并应用矩阵快速幂,实现高效计算。

Portal

Description

给出一张\(n(n\leq30)\)个点\(m(m\leq100)\)条边的无向图。初始时有一个可乐机器人在点\(1\),这个机器人每秒会做出以下三种行为之一:原地不动,走向相邻点,自爆(自爆后就不能动了)。求经过\(t(t\leq10^6)\)秒后可乐机器人的行动方案数。

Solution

矩阵乘法优化DP。
首先改一下原图:每个点向自己连一条自环;建立一个点\(n+1\)表示自爆,其余每个点向\(n+1\)连一条有向边。然后原问题就简化成了在一个有向图上,每秒走向一个相邻的点。
\(dp[i][x]\)表示机器人在第\(i\)秒时在点\(x\)有多少种方案。做出邻接矩阵\(M\),则转移方程为:
\[ dp[i+1][v]=\sum_{u=1}^n \sum_{v=1}^n dp[i][u]M_{uv} \] 是不是和矩阵乘法有点像?将\(dp[i]\)看做一个向量,则有\(dp[i]=dp[i-1]\times M\)。我们要求的是\(dp[t]=dp[1]\times M^t\),那么只要做矩阵快速幂就好啦。

时间复杂度\(O(n^3logt)\)

Code

//[TJOI2017]可乐
#include <cstdio>
#include <cstring>
inline char gc()
{
    static char now[1<<16],*s,*t;
    if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
    return *s++;
}
inline int read()
{
    int x=0; char ch=gc();
    while(ch<'0'||'9'<ch) ch=gc();
    while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x;
}
const int P=2017;
const int N=40;
int n,m;
struct mtx
{
    int row,col; int x[N][N];
    mtx(int _row=0,int _col=0) {row=_row,col=_col; memset(x,0,sizeof x);}
    friend mtx operator *(mtx A,mtx B)
    {
        mtx C=mtx(A.row,B.col);
        for(int i=1;i<=A.row;i++)
            for(int k=1;k<=A.col;k++)
                for(int j=1;j<=B.col;j++)
                    C.x[i][j]=(C.x[i][j]+A.x[i][k]*B.x[k][j])%P;
        return C;
    }
};
mtx pow(mtx A,int k)
{
    mtx r=mtx(A.row,A.col),t=A;
    for(int i=1;i<=A.row;i++) r.x[i][i]=1;
    for(int i=k;i;i>>=1,t=t*t) if(i&1) r=r*t;
    return r;
}
int main()
{
    n=read(),m=read(); mtx tr=mtx(n+1,n+1);
    for(int i=1;i<=n+1;i++) tr.x[i][i]=1,tr.x[i][n+1]=1;
    for(int i=1;i<=m;i++)
    {
        int u=read(),v=read();
        tr.x[u][v]=tr.x[v][u]=1;
    }
    int t=read(); mtx r=mtx(1,n+1);
    r.x[1][1]=1; r=r*pow(tr,t);
    int ans=0;
    for(int i=1;i<=n+1;i++) ans=(ans+r.x[1][i])%P;
    printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/VisJiao/p/LgP3758.html

【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)内容概要:本文围绕使用MATLAB和XBee技术实现温度传感器无线网络的连续监控展开研究,介绍了如何构建无线传感网络系统,并利用MATLAB进行数据采集、处理与可视化分析。系统通过XBee模块实现传感器节点间的无线通信,实时传输温度数据至主机,MATLAB负责接收并处理数据,实现对环境温度的动态监测。文中详细阐述了硬件连接、通信协议配置、数据解析及软件编程实现过程,并提供了完整的MATLAB代码示例,便于读者复现和应用。该方案具有良好的扩展性和实用性,适用于远程环境监测场景。; 适合人群:具备一定MATLAB编程基础和无线通信基础知识的高校学生、科研人员及工程技术人员,尤其适合从事物联网、传感器网络相关项目开发的初学者与中级开发者。; 使用场景及目标:①实现基于XBee的无线温度传感网络搭建;②掌握MATLAB与无线模块的数据通信方法;③完成实时数据采集、处理与可视化;④为环境监测、工业测控等实际应用场景提供技术参考。; 阅读建议:建议读者结合文中提供的MATLAB代码与硬件连接图进行实践操作,先从简单的点对点通信入手,逐步扩展到多节点网络,同时可进一步探索数据滤波、异常检测、远程报警等功能的集成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值