题目大意:原题链接

给定三个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. EF报LINQ to Entities 不识别方法“Web_JZRepository.Models.copy_materials_details get_Item(Int32) ”,因此该方法无法转换为存储表达式。

    说明用了如 List<T> list=new List<T>(); je.copy_materials_details.SingleOrDefault(x => x.ID ...

  2. 基于docker部署的微服务架构(四): 配置中心

    原文:http://www.jianshu.com/p/b17d65934b58%20 前言 在微服务架构中,由于服务数量众多,如果使用传统的配置文件管理方式,配置文件分散在各个项目中,不易于集中管理 ...

  3. VB.NET多线程入门

    近期项目中遇到了一个处理速度慢阻塞用户界面操作的问题,因此想用多线程来解决. 在处理数据的循环中,新建线程,在新建的线程中处理数据.多线程同一时候处理数据,以此来达到加速的目的,使用户界面操作变得流畅 ...

  4. LoadRunner小技巧集锦

    preftest 性能测试工作室,专注于性能测试技术研究(www.AutomationQA.com) LoadRunner小技巧集锦 1.录制脚本中包含中文,出现乱码怎么办? 把录制选项中的Suppo ...

  5. 【代码备份】NLM插值

    文件路径: main.m: %% 测试函数 clc,clear all,close all; %输入的原始小图 ima_ori=double(imread('F:\Users\****n\Docume ...

  6. 复习及总结--.Net线程篇(1)

    老是没耐心写这些东西,最近想想也工作两年了,该对自己的东西做个整理了,不知道这次能坚持写几篇,总得来说尽量督促自己吧 言归正传,.net中的多线程主要可以使用两种方法进行调用 1,异步调用 2,Thr ...

  7. Fel初认识

    Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过函数实现,运算符(+.-等都是Fel函数),所有这 ...

  8. Struts 2再曝远程代码执行漏洞S2-037

    导读今年4月份,Apache Stuts 2之上发现的S2-033远程代码执行漏洞,以迅雷不及掩耳之势席卷而来.其利用代码很快就在短时间内迅速传播.而且官方针对这个高危漏洞的修复方案还是无效的. 悲剧 ...

  9. 【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治

    [BZOJ2253][2010 Beijing wc]纸箱堆叠 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后,即可自动化生产三边边长为 ...

  10. Max_connect_errors – MySQL性能参数详解

    转载http://blog.csdn.net/wulantian/article/details/9670957 ax_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过 ...