P4159 [SCOI2009]迷路

传送门

先考虑只有 01 边权的情况

显然可以DP+矩阵加速

但是现在边权不止 1

然鹅最大也只有 9

所以从这里入手,把点拆成 9 个,然后点之间的边权也就可以变成 1 了

同样的转移和矩阵加速

注意点之间的连接关系

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) f=-1; ch=getchar(); }
    while(ch>=‘0‘&&ch<=‘9‘) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
const int N=207,mo=2009;
inline int fk(int x) { return x>=mo ? x-mo : x; }
int n,T,m;
struct matrix//矩阵乘法不解释
{
    int a[N][N];
    matrix () { memset(a,0,sizeof(a)); }
    inline matrix operator * (const matrix &tmp) const {
        matrix res;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=m;j++)
                for(int k=1;k<=m;k++)
                    res.a[i][j]=fk(res.a[i][j]+a[i][k]*tmp.a[k][j]%mo);
        return res;
    }
}F,M;
matrix ksm(matrix X,int Y)//矩阵快速幂不解释
{
    matrix res;
    for(int i=1;i<=m;i++) res.a[i][i]=1;
    while(Y)
    {
        if(Y&1) res=res*X;
        X=X*X; Y>>=1;
    }
    return res;
}
char s[N];
int main()
{
    n=read(); T=read(); m=n*9;
    for(int i=1;i<=n;i++)//构造转移矩阵
    {
        int t=(i-1)*9+1;
        for(int j=1;j<9;j++) M.a[t+j][t+j-1]=1;
        scanf("%s",s+1);
        for(int j=1;j<=n;j++)
        {
            if(s[j]==‘0‘) continue;
            M.a[t][(j-1)*9+s[j]-‘0‘]=1;
        }
    }
    F.a[1][1]=1;
    F=F*ksm(M,T);
    printf("%d",F.a[1][(n-1)*9+1]);
    return 0;
}

原文地址:https://www.cnblogs.com/LLTYYC/p/9907672.html

时间: 2024-10-08 08:02:27

P4159 [SCOI2009]迷路的相关文章

bzoj1297 / P4159 [SCOI2009]迷路

P4159 [SCOI2009]迷路 如果边权只有 0/1 那么不就是一个灰常简单的矩阵快速幂吗! 然鹅边权 $<=9$ 所以我们把每个点拆成9个点! 解决~ 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define re register 5 using namespace std; 6 const int mod=2009; 7 int m,n,t;long long q; 8

矩阵乘法专题1——bzoj 1297 [SCOI2009] 迷路题解

题目链接 题意:给两个长度分别为n和m的序列,现在有两种操作:1.分别选择两个序列的一个非空前缀,切两个前缀的最后一位相同,删除之,得到1分(只累计),消耗e:2.直接删除两个序列,消耗值定于两个序列之前删除的元素个数之和,并且使得得到的分有效(之前没有有效分) 分析: 首先,问题其实就是转化成,进行若干次操作1,然后进行操作2 还要找到一个判别标准,来评判较优的状态(贪心) 每次的消耗值比较大,其实可以计算出最大的删除次数,这个值不是很大 状态表示: 简单的,一个状态可以表示为串A的位置.串B

1297: [SCOI2009]迷路

1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 652  Solved: 442[Submit][Status] Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间. Input

[BZOJ 1297][SCOI2009]迷路

1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1418  Solved: 1017[Submit][Status][Discuss] Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定

BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]

Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间. Input 第一行包含两个整数,N T. 接下来有 N 行,每行一个长度为 N 的字符串. 第i行第j列为'0'表示从节点i到节点j没有边. 为'1'到'9'表示从节点i到节点j需要耗费的时间. Output 包

BZOJ1297 [SCOI2009]迷路

Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间. Input 第一行包含两个整数,N T. 接下来有 N 行,每行一个长度为 N 的字符串. 第i行第j列为'0'表示从节点i到节点j没有边. 为'1'到'9'表示从节点i到节点j需要耗费的时间. Output 包

BZOJ1297 [SCOI2009]迷路 【矩阵优化dp】

题目 windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间. 输入格式 第一行包含两个整数,N T. 接下来有 N 行,每行一个长度为 N 的字符串. 第i行第j列为'0'表示从节点i到节点j没有边. 为'1'到'9'表示从节点i到节点j需要耗费的时间. 输出格式 包含一个整数,可能的路径数

JZ高中OJ 1036. [SCOI2009]迷路

Time Limits: 1000 ms  Memory Limits: 65536 KB  Detailed Limits Description windy在有向图中迷路了.该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1.现在给出该有向图,你能告诉windy总共有多少种不同的路径吗?注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间. Input 第一行包含两个整数,N T.接下来有 N 行,每行一个长度为 N 的字符串.第i

BZOJ 1297 SCOI2009 迷路 矩阵乘法

题目大意:给定一个邻接矩阵,求1~n的边权恰好为T的路径条数 考虑当所有边权都是1的时候 那么显然邻接矩阵自乘T次之后a[1][n]就是答案 因为当边权为1的时候a[i][j]可以表示从第i个点转移到第j个点的方案数 显然这个符合矩乘的定义 现在边权最大为9 那么将一个点拆成9个 第i个点拆成的第j+1个点向第j个点连一条边权为1的边 那么i->j有一条边权为k的边等价于i向j拆成的第k个点连边 #include <cstdio> #include <cstring> #in