ZOJ 2853 矩阵乘法
来源:互联网 发布:黑鹰基地vb教程 编辑:程序博客网 时间:2024/04/28 08:24
很神奇的4720msAC....
看来double 不是一般的慢啊!!哎呀呀~
#include<iostream>#include<string.h>#include<cstdio>#include<cmath>#define eps 1e-5using namespace std;struct node{double m[222][222];}res,temp,mod;int n,m,t;node matriXmult( node a,node b ){ node c; memset( c.m,0,sizeof(c.m) ); 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++ ) { if( b.m[k][j] ) c.m[i][j]+=a.m[i][k]*b.m[k][j]; } return c;}void matrix_Power(){ //memset( res.m,0,sizeof(res.m) ); //memset( temp.m,0,sizeof(temp.m) ); for( int i=0;i<n;i++ ) {for( int j=0;j<n;j++ ) temp.m[i][j]=mod.m[i][j], res.m[i][j]=i==j; } for( int i=0;m>=(1<<i);i++ ) { if( m&(1<<i) ) res=matriXmult(res,temp); temp=matriXmult(temp,temp); }}int main(){ int date[222]; while( scanf("%d%d",&n,&m)!=EOF ){if( n==0&&m==0 )break;for( int i=0;i<n;i++ ) scanf( "%d",&date[i] ); memset( mod.m,0,sizeof(mod.m) ); for( int i=0;i<n;i++ ) mod.m[i][i]=1; scanf( "%d",&t ); int a,b;double rate; for( int i=0;i<t;i++ ) { scanf( "%d%d%lf",&a,&b,&rate ); mod.m[a][a]-=rate; mod.m[a][b]+=rate; } matrix_Power(); double ans=0; for( int i=0;i<n;i++ ) ans+=date[i]*res.m[i][n-1]; printf( "%.0lf\n",ans ); }}
下面的代码优化了一下,果然不用结构体还是十分的省时间的啊!
下面的代码Time:470ms,小成就啊!
#include<iostream>#include<string.h>#include<cstdio>#include<cmath>#define eps 1e-12using namespace std;double res[201][201],mod[201][201];int n,m,t;void matriXmult( double a[][201],double b[][201] ){ int i,j,k; double c[201][201]; for( int i=0;i<n;i++ ) for( int j=0;j<n;j++ ) c[i][j]=0; for( int i=0;i<n;i++ ) for( int k=0;k<n;k++ ) if( a[i][k]>eps ) for( int j=0;j<n;j++ ) c[i][j]+=a[i][k]*b[k][j]; for( int i=0;i<n;i++ ) for( int j=0;j<n;j++ ) a[i][j]=c[i][j];}void matrix_Power(double res[][201],int m){ if( m==1 ) { for( int i=0;i<n;i++ ) for( int j=0;j<n;j++ ) res[i][j]=mod[i][j]; return ; } matrix_Power( res,m>>1 ); matriXmult( res,res ); if( m&1 )matriXmult( res,mod );}int main(){ int date[222]; while( scanf("%d%d",&n,&m)!=EOF ){if( n==0&&m==0 )break;for( int i=0;i<n;i++ ) scanf( "%d",date+i ); for( int i=0;i<n;i++ ) for( int j=0;j<n;j++ ) mod[i][j]=i==j; scanf( "%d",&t ); int a,b;double rate; for( int i=0;i<t;i++ ) { scanf( "%d%d%lf",&a,&b,&rate ); mod[a][a]-=rate; mod[a][b]+=rate; } matrix_Power(res,m); double ans=0; for( int i=0;i<n;i++ ) ans+=date[i]*res[i][n-1]; printf( "%.0lf\n",ans ); } return 0;}
- ZOJ 2853 矩阵乘法
- ZOJ(矩阵乘法+线段树)
- ZOJ Alice's Sequence II //矩阵乘法
- zoj 2671 Cryptography(线段树+矩阵乘法)
- zoj 3690 Choosing number(矩阵乘法+dp)
- zoj 3772 Calculate the Function(矩阵乘法)
- ZOJ 2671 (线段树+矩阵乘法)
- ZOJ 1276 Optimal Array Multiplication Sequence(矩阵链乘法)
- ZOJ 3772 —— Calculate the Function(矩阵乘法)
- zoj 2317 Nice Patterns Strike Back(矩阵乘法)
- zoj 3772 Calculate the Function(线段树+矩阵乘法)
- 【ZOJ】Nice Patterns Strike Back(矩阵快速乘法)
- ZOJ 3772 Calculate the Function [线段树+矩阵乘法]【思维?】
- ZOJ-3772 Calculate the Function(线段树,矩阵乘法)
- zoj 2853 Evolution 矩阵
- 矩阵乘法
- 矩阵乘法
- 矩阵乘法
- JS中eval工作原理和json格式(eval+json两者结合应用)2011-07-05 22:39--本文讲解一下javascript中eval与json的应用问题。
- Learning dense Models of Query Similarity from User Click Logs
- listView中为什么使用setlistAdapter
- 计算任何一天是星期几的几种算法
- eclipse配置PyDev后console无内容显示
- ZOJ 2853 矩阵乘法
- QT 文本 中文乱码
- php中date() format具体内容
- Common BeanUtils组件的使用(源码)
- android项目增加ant建构
- 农夫、狼、羊、白菜(回溯法求解)
- Java的三种输入方式
- 网页制作常用秘籍花招集合
- MFC AppWizard生成的APP解析