hdu 2429 Word Game(矩阵)
来源:互联网 发布:域名备案成功 编辑:程序博客网 时间:2024/05/01 20:55
hdu 2429 Word Game
首先根据字符串首位相接可以得到一个所有字符串状态递推的中间矩阵,题目要求第一个玩家赢的方法数,显然第一个玩家赢即是递推过程中第奇数次推到了终止字符串,那么我们就考虑所有第奇数次推到终止字符串的次数加在一起就是最终答案,但是如何求矩阵奇数次幂的和就是问题了,没想出来,看了别人的思路:
来源
A^1+A^3+A^5+A^7+...+A^n(n是<=k的最大奇数)
=A^1+A^1*(A^2+A^4+A^6+...+A^n-1)
令T=A^2;
=A^1+A^1*(T^1+T^2+...+T^(n-1)/2)
推到这一步就好解决了,括号里的式子就是等比矩阵求和#include<cstdio>#include<cstring>#include<vector>using namespace std;#define MAXN 65#define MOD 10001struct mat{ int m[MAXN][MAXN];};char word[MAXN][15];void debug(mat a,int n){ printf("\n"); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%d ",a.m[i][j]); printf("\n"); }}mat multi(const mat &a,const mat &b,int n){ mat ans; memset(&ans,0,sizeof(ans)); for(int i=0;i<n;i++) for(int k=0;k<n;k++) if(a.m[i][k]) for(int j=0;j<n;j++) { ans.m[i][j]+=a.m[i][k]*b.m[k][j]; ans.m[i][j]%=MOD; } return ans;}mat pow(mat a,int k,int n){ mat ans; memset(&ans,0,sizeof(ans)); for(int i=0;i<n;i++) ans.m[i][i]=1; while(k) { if(k&1) ans=multi(ans,a,n); a=multi(a,a,n); k>>=1; } return ans;}int main(){ int s,e; mat a,b; int cas,k,n; scanf("%d",&cas); while(cas--) { memset(&a,0,sizeof(a)); memset(&b,0,sizeof(b)); scanf("%d",&n); for(int i=0;i<n+2;i++) scanf("%s",word[i]); scanf("%d",&k); for(int i=0;i<n;i++) if(strcmp(word[n],word[i])==0) {s=i;break;} for(int i=0;i<n;i++) if(strcmp(word[n+1],word[i])==0) {e=i;break;} for(int i=0;i<n;i++) { char c=word[i][strlen(word[i])-1]; for(int j=0;j<n;j++) { if(word[j][0]==c) { a.m[j][i]=+1;//?? } } } //debug(a,n);//1 b=multi(a,a,n); for(int i=0;i<n;i++) { b.m[i][i+n]=1; b.m[i+n][i+n]=1; } //debug(b,n<<1);//2 int kk=k; if(kk%2==0) kk--; int kkk=(kk-1)/2; b=pow(b,kkk+1,n<<1); //debug(b,n<<1); for(int i=0;i<n;i++) for(int j=0;j<n;j++) b.m[i][j]=b.m[i][j+n]; for(int i=0;i<n;i++) b.m[i][i]--; b=multi(a,b,n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) b.m[i][j]+=a.m[i][j]; //debug(b,n<<1); int ans=b.m[e][s]; printf("%d\n",ans); //printf("kk %d\n",kk); //printf("kkk %d\n",kkk); //printf("s %d\n",s); //printf("e %d\n",e); } return 0;}
0 0
- hdu 2429 Word Game(矩阵)
- HDU 2429 Word Game
- hdu 2429 Word Game
- Word Game hdu 2429 综合题
- hdu 1505 City Game 矩阵系列(二)
- HDU 1505 City Game(01矩阵 dp)
- HDU 1505 City Game-dp-(最大子矩阵模型)
- HDU 1505(City Game)动态规划-最大矩阵
- hdu 1505 City Game 简单DP 最大子矩阵 迭代法
- HDU 5863 cjj's string game(矩阵快速幂)
- Hdu-5863 cjj's string game(矩阵快速幂)
- HDU 5863 cjj's string game(矩阵dp)
- HDU 5863 cjj's string game(矩阵快速幂) ★
- HDU 5863 cjj's string game(矩阵快速幂)
- hdu 1505 City Game(最大子矩阵)
- HDU 1505 City Game (单调栈+最大子矩阵面积)
- HDU 5863 cjj's string game(矩阵优化DP)
- Game HDU
- SQL语句技巧,不敢独享,特此呈上
- 养生系列 之 百合莲子豆浆的做法
- ubuntu14.04 64位安装longeneQQ遇到的问题
- 开发在ios平台开发游戏了
- ubuntu 12.04 解压安装jdk
- hdu 2429 Word Game(矩阵)
- 新手初练:用ASP做一个域名查询系统
- ASP.NET编程中的十大技巧
- 马上就要离开了
- 防止网站重复投票
- 运行asp脚本的asp脚本(原作:V37)
- 编译Boost 详细步骤 适用 VC6 VS2003 VS2005 VS2008 VS2010
- 【C语言天天练(零)】变量的存储类型
- 《影响力》读书笔记