矩阵递推

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long
#include <algorithm>
using namespace std;
int n, m, t, act;
int opt[2000], len[100];
char s[20][70];
struct Matrix {
static const int N = 75;
ll num[N][N];
void clear() {
memset(num, 0, sizeof(num));
}
void unit(){
clear();
for(int i = 0; i < N; i++) num[i][i] = 1ll;
}
/*void print() {
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++) {
printf("%d", num[i][j]);
}
cout<<endl;
}
cout<<endl;
} */
};
Matrix operator * (const Matrix & a, const Matrix & b) {
Matrix res;
res.clear();
for(int i = 0; i <= n * m; i++) {
for(int j = 0; j <= n * m; j++) {
for(int k = 0; k <= n * m; k++) {
res.num[i][j] += a.num[i][k] * b.num[k][j];
}
}
}
return res;
}
Matrix operator ^ (Matrix a, ll k) {
Matrix ans;
ans.unit();
while(k) {
if(k & 1ll) ans = ans * a;
a = a * a;
k >>= 1;
}
return ans;
}
Matrix build(int k) {
Matrix ans;
ans.clear();
ans.num[0][0] = 1ll;
for(int i = 1; i <= n * m; i++) {
int ind = opt[i], cur = k % len[ind];
switch (s[ind][cur]) {
case 'W' : if(i > 1) {ans.num[i][i - 1] = 1ll;}break;
case 'E' : if(i < m * n) {ans.num[i][i + 1] = 1ll;}break;
case 'N' : if(i > m) {ans.num[i][i - m] = 1ll;}break;
case 'S' : if(i < m * n - m) {ans.num[i][i + m] = 1ll;}break;
case 'D' : break;
default : ans.num[0][i] = s[ind][cur] - '0';ans.num[i][i] = 1ll;break;
}
}
return ans;
}
Matrix r1, r2, tmp;
int main() {
cin >> n >> m >> t >> act;
for(int i = 1; i <= n * m; i++) scanf("%1d", &opt[i]),opt[i]++;
for(int i = 1; i <= act; i++) cin>>s[i],len[i] = strlen(s[i]);
tmp.unit();
for(int i = 0; i < 60; i++) {
if(i == (t % 60)) r2 = tmp;
tmp = tmp * build(i);
}
r1 = tmp;
r1 = r1 ^ (t/60);
r1 = r1 * r2;
ll ma = 0ll;
for(int i = 1; i <= n * m; i++) ma = max(ma, r1.num[0][i]);
cout<<ma<<endl;
return 0;
}

BZOJ 2973 入门OJ4798 石头游戏的更多相关文章

  1. bzoj2973 入门oj4798 石头游戏

    我们人为地搞出来一个全能神,每次调用他他可以给一个节点 \(1\) 个石头. 这样,当前的状态就可以由上一秒的状态搞过来,这就像是一个递推.用矩阵加速. #include <iostream&g ...

  2. 【BZOJ2000】[HNOI2000]取石头游戏(贪心,博弈论)

    [BZOJ2000][HNOI2000]取石头游戏(贪心,博弈论) 题面 BZOJ 洛谷 题解 这题好神仙啊,窝不会QaQ. 假装一下只有三个元素\(a_{i-1},a_i,a_{i+1}\),并且满 ...

  3. CH3401 石头游戏(矩阵快速幂加速递推)

    题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...

  4. BZOJ 1444:[JSOI2009]有趣的游戏

    BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...

  5. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]

    题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...

  6. CH3401 石头游戏

    题意 3401 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明 ...

  7. 【BZOJ2973】石头游戏 矩阵乘法

    [BZOJ2973]石头游戏 Description 石头游戏的规则是这样的. 石头游戏在一个n行m列的方格阵上进行.每个格子对应了一个编号在0~9之间的操作序列. 操作序列是一个长度不超过6且循环执 ...

  8. bzoj 5393 [HAOI2018] 反色游戏

    bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑 ...

  9. [luogu] P3210 [HNOI2010]取石头游戏(贪心)

    P3210 [HNOI2010]取石头游戏 题目描述 A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参 ...

随机推荐

  1. MDI和在TabPage

    无奈的.net探索 MDI和在TabPage中增加Form分页? MDI(Multiple Document Interface)是一种在窗口中嵌套窗口的接口, 与之对应的是SDI(Single Do ...

  2. java 中设计模式

    1. 单例模式(一个类只有一个实例) package ch.test.notes.designmodel; /** * Description: 单例模式 (饿汉模式 线程安全的) * * @auth ...

  3. CPP-基础:关于多态

        类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持面向对象的,其实不然,Visua ...

  4. lru缓存测试类

    package demo.mytest; import java.io.Serializable;import java.util.LinkedHashMap;import java.util.con ...

  5. XML解析(一) DOM解析

    XML解析技术主要有三种: (1)DOM(Document Object Model)文档对象模型:是 W3C 组织推荐的解析XML 的一种方式,即官方的XML解析技术. (2)SAX(Simple ...

  6. 【php】 php-fpm 配置见解

    来源:php官方文档 Init script setup=== You will probably want to create an init script for your new php-fpm ...

  7. 牛客网暑期ACM多校训练营(第一场)J Different Integers(树状数组, 离线)

    题意: 给定n个数字, 然后给出m个区间, 求区间外其他数字的种类有多少. 分析: 将区间以r为基准升序排序, 每次处理pre~r的数字第一次出现的位置. #include<bits/stdc+ ...

  8. Django中的app及mysql数据库篇(ORM操作)

    Django常见命令 在Django的使用过程中需要使用命令让Django进行一些操作,例如创建Django项目.启动Django程序.创建新的APP.数据库迁移等. 创建Django项目 一把我们都 ...

  9. js的setInterval和setTimeout的那些浅坑

    setInterval和setTimeout的区别简单提一下 setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式.方法会不停地调用函数,直到 clearInterval() ...

  10. 16,re模块的常用方法

    ret =re.findall('\d+', 'eva123egon4yuan567') print(ret)#返回满足条件的结果 ,放在一个列表里. ret2 = re.search('\d+',' ...