AcWing 206. 石头游戏 矩阵乘法|矩阵快速幂
AcWing 206. 石头游戏
石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明。
操作序列是一个长度不超过6且循环执行、每秒执行一个字符的字符串。
每秒钟,所有格子同时执行各自操作序列里的下一个字符。
序列中的每个字符是以下格式之一:
1、数字0~9:表示拿0~9个石头到该格子。
2、NWSE:表示把这个格子内所有的石头推到相邻的格子,N表示上方,W表示左方,S表示下方,E表示右方。
3、D:表示拿走这个格子的所有石头。
给定每种操作序列对应的字符串,以及网格中每个格子对应的操作序列,求石头游戏进行了 t 秒之后,石头最多的格子里有多少个石头。
在游戏开始时,网格是空的。
输入格式
第一行4个整数n, m, t, act。
接下来n行,每行m个字符,表示每个格子对应的操作序列。
最后act行,每行一个字符串,表示从0开始的每个操作序列。
输出格式
一个整数:游戏进行了t秒之后,所有方格中石头最多的格子有多少个石头。
输入样例:
1 6 10 3
011112
1E
E
0
输出样例:
3
样例解释
样例中给出了三组操作序列,第一个格子执行编号为0的操作序列”1E”,第二至五个格子执行编号为1的操作序列”E”,第六个格子执行编号为2的操作序列”0”。
这是另一个类似于传送带的结构,左边的设备0间隔地产生石头并向东传送。
设备1向右传送,直到设备2。
10秒后,总共产生了5个石头,2个在传送带上,3个在最右边。
题解:我们可以把网格看成一维向量,下标从1开始,num(i,j) = (i-1)*m+j;
我们可以定义一个状态矩阵f,下标从0~n*m,其中f[num(i,j)]记录格子(i,j)中石头个数。
操作序列长度不超过6,1~6的最小公倍数为60,所以经过60s后所有序列都会处于重新开始的位置。每60s一个循环,我们只需记录第一个60s。
对于1~60之间的每一秒k,所有格子操作可以构成一个状态矩阵,矩阵行列下标都是0~n*m,构造方法如下:
- 若网格(i,j)第k秒的操作字符为“N”,且i>1,则令Ak[num(i,j),num(i-1,j)] = 1,表示把石子推到上面的格子里。“W”、“S”、“E”类似。
- 若网格(i,j)第k秒的操作字符为数字x,则令Ak[0,num(i,j)] = x,Ak[num(i,j),num(i,j)] = 1。
- 令Ak[0,0] = 1。 (保证f[0]始终为1)
- 其他部分赋值为0。
最后求出f中的最大值。
代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 70
#define mod 1000000007
#define ll long long
int n,m,t,act;
struct Matrix
{
long long ma[maxn][maxn];
Matrix() {
memset(ma,, sizeof(ma));
}
}f,e[maxn],d;
Matrix mul(Matrix A,Matrix B)
{
Matrix C;
for(int i=;i<maxn;i++)
for(int j=;j<maxn;j++)
for(int k=;k<maxn;k++)
C.ma[i][j] += (A.ma[i][k]*B.ma[k][j]);
return C;
}
Matrix cel(Matrix A,Matrix B) {
ll w[]={};
for(int j=;j<=n*m;j++)
for(int k=;k<=n*m;k++)
w[j]+=A.ma[][k]*B.ma[k][j];
memcpy(A.ma[],w,sizeof(w));
return A;
}
Matrix pow_mod(Matrix A,long long t)
{
Matrix B = d;
while(t) {
if(t&) A = cel(A,B); //可直接mul(f,e[i]);
B=mul(B,B);
t>>=;
}
return A;
}
char s[][],cz[maxn][];
int len[maxn];
int num(int i,int j) {return (i-)*m+j;}
int main()
{
scanf("%d%d%d%d",&n,&m,&t,&act);
for (int i = ; i <= n; i++) scanf("%s",s[i]+);
for (int i = ; i < act; i++) scanf("%s",cz[i]),len[i] = strlen(cz[i]);
for (int k = ; k <= ; k++) {
e[k].ma[][] = ;
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
int x = s[i][j] - '', y = (k-)%len[x];
if (cz[x][y] >= '' && cz[x][y] <= '') {
e[k].ma[][num(i,j)] = cz[x][y]-'';
e[k].ma[num(i,j)][num(i,j)] = ;
} else if (cz[x][y] == 'N' && i->) e[k].ma[num(i,j)][num(i-,j)] = ;
else if (cz[x][y] == 'W' && j->) e[k].ma[num(i,j)][num(i,j-)] = ;
else if (cz[x][y] == 'S' && i+<=n) e[k].ma[num(i,j)][num(i+,j)] = ;
else if (cz[x][y] == 'E' && j+<=m) e[k].ma[num(i,j)][num(i,j+)] = ;
}
}
if (k == ) d = e[];
else d = mul(d,e[k]);
}
ll ans = ;
f.ma[][] = ;
f = pow_mod(f,t/);
int z = t%;
for (int i = ; i <= z; i++) f = cel(f,e[i]); //可直接mul(f,e[i]);
for (int i = ; i <= n*m; i++) ans = max(ans,f.ma[][i]);
printf("%lld\n",ans);
return ;
}
AcWing 206. 石头游戏 矩阵乘法|矩阵快速幂的更多相关文章
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...
- Luogu T7152 细胞(递推,矩阵乘法,快速幂)
Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ...
- poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7825 Accepted: 3068 Descri ...
- HDU4965 Fast Matrix Calculation —— 矩阵乘法、快速幂
题目链接:https://vjudge.net/problem/HDU-4965 Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Othe ...
- BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...
- bzoj 3240 矩阵乘法+十进制快速幂
首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...
- 【HDOJ5950】Recursive sequence(矩阵乘法,快速幂)
题意:f[1]=a,f[2]=b,f[i]=2f[i-2]+f[i-1]+i^4(i>=3),多组询问求f[n]对2147493647取模 N,a,b < 2^31 思路:重点在于i^4的 ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
随机推荐
- HDU 1114 完全背包 HDU 2191 多重背包
HDU 1114 Piggy-Bank 完全背包问题. 想想我们01背包是逆序遍历是为了保证什么? 保证每件物品只有两种状态,取或者不取.那么正序遍历呢? 这不就正好满足完全背包的条件了吗 means ...
- [转载] 虚拟机3种网络模式(NAT, Host-only, Bridged)
实例讲解虚拟机3种网络模式(桥接.nat.Host-only) 转载自:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html ...
- cp拷贝
1 cp 拷贝.复制 NAME cp - copy files and directories SYNOPSIS cp [OPTION]... [-T] SOURCE DEST -- c ...
- Appium + python 自动化测试环境配置
-------------------------------------------------------------- 1. jdk-8u121-window(32位的就下载32位的,64位的就 ...
- poj 2996
提示:很烦很简单的国际象棋棋盘模拟,输入比较麻烦而已 输出时: 1.不论黑白,KQRBN P均是依次输出,强制大写,但不输出“P”,只输出其坐标 2.对白棋的位置,小行优先大行输出(行的数字越小则优先 ...
- uni-app 常用框架内置方法 更新中 .....
获取 登录信息,getStorage 初始化页面数据 请求 下拉刷新页面 加载更多 点击跳转 个人中心 uni.request(OBJECT) success=成功 fail=失 ...
- scrapdy部署爬虫项目
原文:https://blog.csdn.net/JLaiRen/article/details/82902321 scrapyd安装 打开命令行工具输入命令:pip install scrapyd ...
- chrome浏览器频繁卡死
输入chrome:flag 把对应的GPU选项关掉 或者重装 ,从360软件管理器上装
- 2018-8-10-win10-uwp-win2d-使用-Path-绘制界面
title author date CreateTime categories win10 uwp win2d 使用 Path 绘制界面 lindexi 2018-08-10 19:17:19 +08 ...
- SpringBoot2.X 项目使用外置绝对路径的配置文件
spring-boot-absolute-config 前言 该工程是为解决应用部署应用时指定配置文件存放位置的问题. SpringBoot项目默认加载以下位置的配置文件: ? 1 2 3 4 cla ...