【BZOJ】2165: 大楼

【BZOJ】2165: 大楼

【题意】从第0层开始有无穷层,每层有n个房间,给定矩阵A,A[i][j]表示从第x层的房间 i 可以跳到第x+A[i][j]层的房间 j (x任意),A[i][j]=0表示不能跳。初始在第0层第1个房间,求最少跳几次可以到达>=m层。n<=100,m<=10^18。

【算法】矩阵快速幂

【题解】我的写法好像和网上的不太一样……

设$f_n[i]$表示跳n步在房间 i 的最高层数(这里全部的n和题目的n无关),考虑递推列向量$f_n$,设转移矩阵T,满足$T_{i,j}=A_{j,i}$,那么有:

$$T \times f_n=f_{n+1}$$

初始状态f0={1,0,0…0},那么写成幂形式:

$$T^n \times f_0=f_n$$

为了方便,容易发现$T^n$的最左一列就是$f_n$。

我们要跳到$f_n$中包含>=m的数字为止,所以预处理所有$T^{2^i}$,倍增即可。

复杂度O(n^3*log m+n log m)。

【BZOJ】2165: 大楼
【BZOJ】2165: 大楼

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=101;
const ll inf=1000000000000000000;
ll m,c2[N],c[N][N],A[70][N][N],ans[N][N],ans2[N][N];
int n;
void multply(ll a[N][N],ll b[N][N],ll d[N][N]){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            c[i][j]=-inf;//
            for(int k=1;k<=n;k++){
                c[i][j]=max(c[i][j],a[i][k]+b[k][j]);
            }
        }
    }
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)d[i][j]=c[i][j];
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        scanf("%d%lld",&n,&m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%lld",&A[0][j][i]);
                if(A[0][j][i]==0)A[0][j][i]=-inf;
            }
        }
        int tot=0;
        bool ok=0;
        for(int i=1;i<=n;i++)if(A[tot][i][1]>=m){ok=1;break;}
        if(!ok){
            while(1){
                tot++;
                multply(A[tot-1],A[tot-1],A[tot]);
                bool ok=0;
                for(int i=1;i<=n;i++)if(A[tot][i][1]>=m){ok=1;break;}
                if(ok)break;
            }
        }
        c2[0]=1;
        for(int i=1;i<=tot-1;i++)c2[i]=c2[i-1]*2;
        ll ANS=c2[tot-1];
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans[i][j]=A[tot-1][i][j];
        for(int i=tot-2;i>=0;i--){
            multply(ans,A[i],ans2);
            bool ok=1;
            for(int j=1;j<=n;j++)if(ans2[j][1]>=m)ok=0;
            if(ok){
                ANS+=c2[i];
                for(int k=1;k<=n;k++)for(int l=1;l<=n;l++)ans[k][l]=ans2[k][l];//
            }
        }
        printf("%lld\n",ANS+1);
    }
    return 0;
}

View Code

 

注意T[i][j]=0时设为-inf,即不可达。

 

网上的角度:关键在于题意的理解……给定n个点的有向图边权矩阵,0表示无边,求最少经过几条边使得路径长度>=m。

经过指定条边后的最长路矩阵是很容易知道的,设$C^x$表示经过x条边后的最长路矩阵,$A$表示有向边权矩阵(0要设为-inf),那么:

$$C^x(i,j)=\max_k\{C^{x-1}(i,k)+A(k,j)\}$$

所以C^x=A^x。

预处理$C^{2^i}$,然后倍增到第一行出现>=m的数字为止。

复杂度O(n^3 log m+n log m)。

 

转载于:https://www.cnblogs.com/onioncyc/p/8780568.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101723.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 深度学习笔记(三):激活函数和损失函数

    深度学习笔记(三):激活函数和损失函数这一部分来探讨下激活函数和损失函数。在之前的logistic和神经网络中,激活函数是sigmoid,损失函数是平方函数。但是这并不是固定的。事实上,这两部分都有很多其他不错的选项,下面来一一讨论3.激活函数和损失函数3.1激活函数关于激活函数,首先要搞清楚的问题是,激活函数是什么,有什么用?不用激活函数可不可以?答案是不可以。激活函数的主要作用是提供网络的非线性建模能力。如果没有激活函数,那么

  • 概率论中的PDF,PMF,CDF区别和联系

    概率论中的PDF,PMF,CDF区别和联系1. PDF:概率密度函数(probabilitydensityfunction),在数学中,连续型随机变量的概率密度函数(在不至于混淆时可以简称为密度函数)是一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数。本身不是概率,取值积分后才是概率。2. PMF:概率质量函数(probabilitymassfunction),在概率论中,概率质量函数

  • 设计模式六大原则——迪米特法则(LoD)

    设计模式六大原则——迪米特法则(LoD)

  • windows通过命令行查看进程杀死进程_windows强制结束进程命令

    windows通过命令行查看进程杀死进程_windows强制结束进程命令tasklist#查看进程信息,tasklist命令的筛选器功能非常强大先使用tasklist命令查看当前系统中的进程列表,然后针对你要杀的进程使用taskkill命令如要杀nginx.exe进程,命令如下:taskkill/imnginx.exe/f也可以使用pid杀:taskkill/pid{pid}您可以运行taskkill/?来获取更多更多有关taskkill的信息。…

  • 教你两分钟做出一个精美好用的404页面

    教你两分钟做出一个精美好用的404页面怎么快速的做好网站404跳转页面?要想做的又快又好,开源字节建议就套用精美的模板即可。总的来说就是利用404页面模板,进行修改,修改好一个404页面上传到网站根目录,然后一般在网站空间的后台直接设置选择用此文件作为404页面即可。具体利用404模板修改制作404页面流程如下:第一步获取404代码文件,下载一套404页面模板(一般一个404代码文件,和一张404图片)第二步修改文件信息,把404页面代码文件里面的链接文字等修改成适用自己的网站的信息。域名,关键字,404图片调用路径

  • 数字信号处理matlab实验心得,数字信号处理学习心得体会3篇

    《数字信号处理》是我们通信工程和电子类专业的一门重要的专业基础课程,主要任务是研究数字信号处理理论的基本概念和基本分析方法,通过建立数学模型和适当的数学分析处理,来展示这些理论和方法的实际应用。数字信号处理技术正飞速发展,它不但自成一门学科,更是以不同形式影响和渗透到其他学科。以下是小编为大家精心准备的:,欢迎参考阅读!数字信号处理学习心得体会一随机数字信号处理是由多种学科知识交叉渗透形成的,在通…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号