POJ3318 Matrix Multiplication ( 随机化 + 矩阵乘法)

6 篇文章 0 订阅
1 篇文章 0 订阅

POJ3318 Matrix Multiplication

原题地址http://poj.org/problem?id=3318

题意:
给定 n x n 的矩阵 A,B,C,问 A * B = C 是否成立?
由于数据组数较低,所以 O(n^3)会TLE。

数据范围
A[i][j],B[i][j]<=100, C[i][j]<=10,000,000

题解:
因为O(n^3)会TLE所以不能直接矩阵乘法,因此,在这里随机生成一个n*1的矩阵r,如果 A * B = C,必然有 A (B r) =C * r
A,B,C,与r相乘都是O(n^2)的。这时只需比对A (B r) 与C * r,如果不同则A * B = C 肯定成立,相同则可能成立,我们只需要在时间允许的范围内尽可能的多次比对,来降低错误率。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<ctime>
using namespace std;
const int N=505;
int n,a[N][N],b[N][N],c[N][N],r[N],x[N],y[N];
bool check()
{
    for(int i=1;i<=n;i++)
    r[i]=rand()%97+1;
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    y[i]+=b[i][j]*r[j]; 

    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    x[i]+=a[i][j]*y[j];
    memset(y,0,sizeof(y));

    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    y[i]+=c[i][j]*r[j]; 

    for(int i=1;i<=n;i++)
    if(x[i]!=y[i]) return 0;

    return 1;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        scanf("%d",&a[i][j]);

        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        scanf("%d",&b[i][j]);

        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        scanf("%d",&c[i][j]);
        int k=1;
        bool flag=0;
        for(;k<=60;k++)
        if(!check())
        {flag=1; break;}

        if(flag) printf("NO\n");
        else printf("YES\n");       
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值