bzoj2973石头游戏——矩阵乘法
Posted Zinn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2973石头游戏——矩阵乘法相关的知识,希望对你有一定的参考价值。
题目:权限题!
写了一下,但提交不了,先放着吧。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,num[10][10],ct,w[90],q,r,T; char c[90][8]; struct Matrix{ int a[90][90]; Matrix operator * (const Matrix &y) const { Matrix x; memset(x.a,0,sizeof x.a); for(int i=1;i<=ct;i++) for(int k=1;k<=ct;k++) for(int j=1;j<=ct;j++) x.a[i][j]+=a[i][k]*y.a[k][j]; return x; } }s[65],ans,ss,ss2; void init() { ans.a[1][0]=1;//ans使用第一行 for(int t=1;t<=60;t++) { s[t].a[0][0]=1;//! for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { int k=num[i][j]; char cc=c[k][w[k]]; if(cc>=‘0‘&&cc<=‘9‘)s[t].a[0][k]=cc-‘0‘; if(cc==‘N‘&&i>1)s[t].a[k][num[i-1][j]]=1; if(cc==‘W‘&&j>1)s[t].a[k][num[i][j-1]]=1; if(cc==‘S‘&&i<n)s[t].a[k][num[i+1][j]]=1; if(cc==‘E‘&&j<m)s[t].a[k][num[i][j+1]]=1; if(w[k]==strlen(c[k])-1)w[k]=0; else w[k]++; } } } int main() { scanf("%d%d%d",&n,&m,&T); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { num[i][j]=++ct; cin>>c[ct]; } init(); q=T/60;r=T%60; if(q) { for(int i=0;i<=ct;i++)ss.a[i][i]=1; for(int i=1;i<=60;i++) ss=ss*s[i]; } if(r) { for(int i=0;i<=ct;i++)ss2.a[i][i]=1; for(int i=1;i<=r;i++) ss2=ss2*s[i]; } ans=ans*ss; ans=ans*ss2; int mx=0; for(int i=1;i<=ct;i++) mx=max(mx,ans.a[1][i]); printf("%d",mx); return 0; }
以上是关于bzoj2973石头游戏——矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章
bzoj3240 && 洛谷P1397矩阵游戏[NOI2013](矩阵乘法+卡常)
BZOJ1444[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法