题目大意:原题链接

给定三个n*n的矩阵A,B,C,验证A*B=C是否成立.

所有解法中因为只测试一组数据,因此没有使用memset清零

Hint中给的傻乎乎的TLE版本:

#include<cstdio>
#include<cstring>
int n,A[][];
int B[][],C[][];
void Input(int m[][])
{
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
scanf("%d",&m[i][j]);
}
}
int main()
{
scanf("%d",&n);
bool sign=true;
Input(A),Input(B),Input(C);
for(int i=;i<=n&&sign;i++){
for(int j=;j<=n&&sign;j++){
int sum=;
for(int k=;k<=n&&sign;k++)
sum+=A[i][k]*B[k][j];
if(sum!=C[i][j]) sign=false;
}
}
if(sign) printf("YES");
else printf("NO");
}

AC版本解法一:神奇的输入优化

之前就看到过几次一个神奇的输入模板,不知道这段代码是否就是那个(提交多次,觉得估计在提交人数多时容易超时)

#include<cstdio>
using namespace std;
int n,A[][];
int B[][],C[][]; int Read()
{
int d=;
char ch,t=;
while((ch=getchar())==' '||ch=='\n') ;
if(ch=='-') t=;
else d=ch-'';
while((ch=getchar())>=''&&ch<='')
d=d*+ch-'';
if(t) return -d;
else return d;
} int main()
{
scanf("%d",&n);
bool sign=true;
for(int i=;i<n;i++){
for(int j=;j<n;j++)
A[i][j]=Read();
}
for(int i=;i<n;i++){
for(int j=;j<n;j++)
B[i][j]=Read();
}
for(int i=;i<n;i++){
for(int j=;j<n;j++)
C[i][j]=Read();
}
for(int i=;i<n&&sign;i++){
for(int j=;j<n&&sign;j++){
int sum=;
for(int k=;k<n;k++)
sum+=A[i][k]*B[k][j];
if(sum!=C[i][j]){
sign=false;
break;
}
}
}
if(sign) printf("YES");
else printf("NO");
}

AC版本解法二:稳稳的随机化算法

#include<ctime>
#include<cstdio>
#include<cstdlib>
#define TLE 2000
int n,A[][];
int B[][],C[][]; void Input(int m[][])
{
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
scanf("%d",&m[i][j]);
}
}
bool Judge()
{
int r,c;//随机行数,列数
int time=*TLE;//注意取的次数需要适当
while(time--){
r=rand()%n+,c=rand()%n+;
int sum=;
for(int k=;k<=n;k++)
sum+=A[r][k]*B[k][c];
if(sum!=C[r][c]) return ;
}
return ;
} int main()
{
scanf("%d",&n);
srand(time(NULL));
Input(A),Input(B),Input(C);
if(Judge()) printf("YES");
else printf("NO");
}

AC版本解法三:流弊的状态压缩

思路;

/*

Problem B: Matrix Multiplication

The author gives an approximate algorithm rather than a precise one.

Randomize a n ×1 matrix X, test if the equation A × B × X = C × X holds true.

If it is not true we can safely say "NO" to this problem.

If it is true, the possibility that  A × B ≠ X is extremely little.

*/

上面是北大网站上的提示,用行向量把C矩阵和A*B矩阵压缩了,看这一句:

Randomize a n ×1 matrix X,用一个随机的列向量。

具体怎实现呢?

用压缩矩阵再比较的方法:

我习惯左乘一个行向量,所以设一个行向量X,X是1*n的矩阵,若A*B等于C则必有X*A*B等于X*C,虽然多乘了一个向量,但是时间复杂度却降低到了O(n^2)了。

这样解的实质是把一个方阵压缩成了一个行向量,向量的每一个元素都是原矩阵该列的的和,也就是说用和来比较。这样大大节省了时间。但是带来一个问题:

如这两个矩阵:

x x x x x x x x x x                    x x x x x x x x x x

x x 1 x x x x 1 x x                    x x 0 x x x x 2 x x

x x x x x x x x x x                    x x x x x x x x x x

x x 1 x x x x 1 x x                    x x 2 x x x x 0 x x

……                                          ……

x x x x x x x x x x                    x x x x x x x x x x

用压缩再比较的方法不能得到正确结果。压缩再比较的关键在于怎么样在和中体现原来每个元素的个性。关键就是X行向量怎么设定。题目在比赛结束后提示是一个随机的向量X,就是把X的每个元素设为随机数。我觉得可以把X设为一个递增的向量:{1、2、…、n},这样更能体现每个元素的个性,而随机有可能在关键点上出现错误。

#include<cstdio>
int n,A[][];
int B[][],C[][];
int E[],e[],t[];
void Input(int m[][])
{
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
scanf("%d",&m[i][j]);
}
}
bool Judge(int n)
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
t[i]+=j*A[j][i];
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
e[i]+=t[j]*B[j][i];
for(int i=;i<=n;i++)
if(e[i]!=E[i]) return false;
return true;
}
int main()
{
scanf("%d",&n);
Input(A),Input(B),Input(C);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
E[i]+=j*C[j][i];//关键部分:j*C[j][i]就是给C矩阵左乘了一个递增的行向量X:{1,2,3,...,n}
if(Judge(n)) printf("YES");
else printf("NO");
}

PKU 3318 Matrix Multiplication(随机化算法||状态压缩)的更多相关文章

  1. poj 3318 Matrix Multiplication 随机化算法

    方法1:暴力法 矩阵乘法+优化可以卡时间过的. 方法2:随机化 随机构造向量x[1..n],则有xAB=xC;这样可以将小运算至O(n^2). 代码如下: #include<iostream&g ...

  2. POJ 3318 Matrix Multiplication(随机算法)

    题目链接 随机算法使劲水...srand((unsigned)time(0))比srand(NULL)靠谱很多,可能是更加随机. #include <cstdio> #include &l ...

  3. PKU 3318 Matrix Multiplication(神奇的输入)

    #include<cstdio> using namespace std; ][]; ][],C[][]; int Read() { ; ; while((ch=getchar())==' ...

  4. 数学(矩阵乘法,随机化算法):POJ 3318 Matrix Multiplication

    Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17783   Accepted: ...

  5. Poj 3318 Matrix Multiplication( 矩阵压缩)

    Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18928   Accepted: ...

  6. POJ3318--Matrix Multiplication 随机化算法

    Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? In ...

  7. POJ 3318 - Matrix Multiplication 第一次用随机化解决问题...

    随机化还是很厉害的...印象最深的是以前手写快排~~一般加个随机化会使耗时不受输入数据的..时间更加稳定 这个题是人品题了...开始交了好多遍都过不了..多交几次终于过了... Program: #i ...

  8. [poj 3318] Matrix Multiplication (随机化+矩阵)

    Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? In ...

  9. poj 3318 Matrix Multiplication

    http://poj.org/problem?id=3318 矩阵A*矩阵B是否等于矩阵C #include <cstdio> #include <cstring> #incl ...

随机推荐

  1. ulimit命令学习

    通过ulimit -n命令可以查看linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值.那么应该在 ...

  2. Qualcomm Vuforia SDK背景

    参考视频:http://edu.csdn.net/course/detail/1467/23125?auto_start=1 一:概述 官网:www.vuforia.com 应用方向:产品交互.虚拟购 ...

  3. hdu 1667(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3);  max(1,2,3 ...

  4. iOS开发之--使用storyboard进行跳转

    iOS开发中使用故事板进行开发是非常高效的一种方式,虽然有这样那样的问题,但是不得不承认,使用sb可以在最短的时间内完成整个项目的布局,节约开发者大量的时间,而且便于修改,非常直观,虽然可能不太灵活, ...

  5. jedispool 连 redis

    java端在使用jedispool 连接redis的时候,在高并发的时候经常卡死,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题 在使用je ...

  6. studio导入Eclipse 项目要改的文件

    添加下面文件即可,一个不能少 1. project 2.project.properties 3.classpath 4.AndroidManifest.xml 以上目录都有可以正常导入studio中

  7. 模拟window桌面实现

    正在开发中的游戏有个全屏功能--可以在window桌面背景上运行,就像一些视频播放器在桌面背景上播放一样的,花了个上午整了个Demo放出来留个纪念. 实现功能:显示图标,双击图标执行相应的程序,右击图 ...

  8. ASP.NET操作Excel(终极方法NPOI)

    ASP.NET操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,能够帮助开发者在没有安装微软Office的情况下读写Office 97-200 ...

  9. Android TextView使用HTML处理字体样式、显示图片等

    一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操 ...

  10. Hibernate如何执行存储过程?

    Hibernate如何执行存储过程? @Overridepublic Boolean setVarValue(final String processInstanceId, final String ...