如果没有食人鱼(鳄鱼),就是普通矩乘

如果有了食人鱼,就要考虑多一点

特殊值入手

注意到食人鱼的周期不会超过4次,它是很小的,而且隐藏了周期性

这个周期性已经提示了要利用周期性dp、所以就考虑把<=4的周期统一,即lcm=12

所以就利用12转移就可以了

然后要注意:当转移不规律的时候,矩乘不满足交换律,所以小于12的部分要放到最后乘(因为矩乘是按照顺序转移的)

码:

#include<iostream>
#include<cstdio>
using namespace std;
#define N 55
#define leaves 10000
int n,m,fishn,T[33],p,pp,v[33][5],f[N][N],lin[N][N],ggg[N][N],g[N][N],fff[N][N],ff[N][N],i,j,l,k,K,a,t,s,b;
bool bsdyg,ky;
int main()
{scanf("%d%d%d%d%d",&n,&m,&s,&t,&K);s++;t++;for(i=1;i<=m;i++){scanf("%d%d",&a,&b);a++,b++;ff[a][b]=ff[b][a]=1;     }scanf("%d",&fishn);for(i=1;i<=fishn;i++){scanf("%d",&T[i]);for(j=0;j<T[i];j++){scanf("%d",&a);v[i][j]=a+1;    }}
for(i=1;i<=n;i++)fff[i][i]=lin[i][i]=1;while(K){//转移
for(i=1;i<=n;i++)f[i][i]=1;
if(bsdyg==0)for(i=1;i<=fishn;i++)f[v[i][0]][v[i][0]]=0;for(i=1;i<=12;i++)
{   for(j=1;j<=n;j++)//起点 for(k=1;k<=n;k++)//中间点 for(l=1;l<=n;l++)//终点 {ky=1;if(bsdyg==0){for(p=1;p<=fishn;p++)if(v[p][i%T[p]]==l){ky=0;break;}}if(ky==1)g[j][l]+=f[j][k]*ff[k][l]%leaves;    //相当于走了一步g[j][l]%=leaves;      }// cout<<i<<endl<<endl;cout<<"PP"<<lin[4][4]<<" "<<lin[6][4]<<endl;for(j=1;j<=n;j++)for(k=1;k<=n;k++){f[j][k]=g[j][k],g[j][k]=0;   //if(f[j][k])cout<<j<<" : "<<k<<" = "<<f[j][k]<<endl;}if(i==K%12){if(bsdyg==0){for(j=1;j<=n;j++)for(k=1;k<=n;k++)lin[j][k]=f[j][k];}else{for(j=1;j<=n;j++)//起点 for(k=1;k<=n;k++)//中间点 for(l=1;l<=n;l++)//终点 {ggg[j][l]+=fff[j][k]*f[k][l]%leaves;    //相当于走了一步   ggg[j][l]%=leaves;}    for(j=1;j<=n;j++)for(k=1;k<=n;k++)fff[j][k]=ggg[j][k],ggg[j][k]=0;  }   }
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
ff[i][j]=f[i][j],f[i][j]=0;   K/=12;bsdyg=1;                    }for(j=1;j<=n;j++)//起点 for(k=1;k<=n;k++)//中间点 for(l=1;l<=n;l++)//终点 {ggg[j][l]+=fff[j][k]*lin[k][l]%leaves;  //相当于走了一步   ggg[j][l]%=leaves;}    for(j=1;j<=n;j++)for(k=1;k<=n;k++)fff[j][k]=ggg[j][k],ggg[j][k]=0;printf("%d",fff[s][t]);}

[ZJOI2005]沼泽鳄鱼 矩乘dp相关推荐

  1. ZJOI2005沼泽鳄鱼

    矩阵优化dp ** 注意:矩阵乘法没有交换律 ** 思路:类比P2151hh去散步 代码特点在一维的答案矩阵 1.矩阵优化两点间方案数不必赘述 2.注意2,3,4可以办到以他们的lcm为周期,正是因为 ...

  2. [ZJOI2005]午餐(贪心+dp)

    首先若只有一个窗口,利用贪心,按吃饭时间从大到小排序即可 正确性证明: 定义 eat[i] = 第i个人的吃饭时间,time[i] = 第i个人的打饭时间 延长时间T[i]=max(eat[i]- ∑ ...

  3. [ZJOI2005]沼泽鳄鱼

    今天继续攻集训队论文的我 题意 一张无向图,不超过 50 50 50 个点 起点 s s s 终点 t" role="presentation">ttt 一个单位时 ...

  4. 矩阵乘法 x 图的邻接矩阵

    邻接矩阵是一种用矩阵形式表示图的方法 那么如果用图的邻接矩阵作矩阵乘法 会有什么神奇的性质呢 我们假设一个N个结点的无向图 我们用G[u][v]=G[v][u]=1G[u][v]=G[v][u]=1G ...

  5. 【邻接矩阵乘法】沼泽鳄鱼

    Links 洛谷_P2579[ZJOI2005]沼泽鳄鱼 SSL_P2511沼泽鳄鱼 居然有点想接触一下鳄鱼这种生物- 题目 解 由于鳄鱼的活动周期只有2,3,4. 所以很容易得到一个为期12的大周期 ...

  6. 欢乐纪中某A组赛【2019.7.6】

    前言 斐大爷NBNBNB 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRank PersonPersonPerson ScoreScoreScore AAA BBB CCC ...

  7. 2017.9.19 禁忌 失败总结

    这题一上来还以为是容斥+矩乘dp..然而它要求的是最大值的期望,所以没有什么思路 然后原来可以ac自动机上转移. 其实n这么小就完全可以考虑拆到ac自动机里,然后就变成了图上期望问题 所以题目就变成了 ...

  8. 【SDOI2009】【BZOJ1875】HH去散步

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因 ...

  9. Regional 做题记录 (50/50)

    写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...

最新文章

  1. 【TCP/IP详解 卷一:协议】第十九章 TCP的交互数据流
  2. github bilibili
  3. Struts——例子
  4. shell中如何判断一个变量是否为空
  5. C#中FuncT,TResult的用法和Lambda表达式
  6. MySQL字符串类型
  7. CCF201612-1 中间数(解法二)(100分)(废除!!!)
  8. 记录开发过程中第一次遇到的回调地狱
  9. 搭建MySQL可视化Web界面服务器
  10. 蓝桥杯Python题目(二)
  11. jw播放器 html5,JW播放器HTML5专用模式
  12. 经常出现正常运行Windows所需的文件已被替换成无法识别的版本
  13. selenium 自动化测试 Chrome 大于 63 版本 不能重定向问题解决办法
  14. 主流HTML5游戏开发引擎的分析和对比
  15. IntelliJ IDEA 激活 破解补丁
  16. Linux常用的远程工具
  17. 小米air2se耳机只有一边有声音怎么办_双十一高性价蓝牙耳机排名,500元内真无线蓝牙耳机推荐...
  18. matlab hdf5,无法使用最新的HDF5打开matlab文件
  19. arthas profiler诊断服务性能
  20. iRobot 推出 Create 3,内置 ROS 2 机器人开发平台(转载)

热门文章

  1. 推荐系统实战-概念理解入门篇
  2. 某东商城获取eid和fp参数方法
  3. Scala开发教程(16): 没有“break”和“continue”的日子
  4. mongodb运算操作符
  5. springBoot+mybaits+达梦数据库
  6. 绿盟漏洞扫描_二十周年专题|绿盟极光,用专注惊艳了时光
  7. windows下使用命令行将employees.sql导入mysql
  8. mysql判断可用性,MySQL -- 主從復制的可靠性與可用性
  9. java体系的四大基类_Java中的io流学习(了解四大基类和基本步骤)
  10. linux同步多台机器的时间