首页 > 代码库 > POJ 3318 Matrix Multiplication(矩阵乘法)

POJ 3318 Matrix Multiplication(矩阵乘法)

题目链接

题意 : 给你三个n维矩阵,让你判断A*B是否等于C。

思路 :优化将二维转化成一维的。随机生成一个一维向量d,使得A*(B*d)=C*d,多次生成多次测试即可使错误概率大大减小。

 1 //3318 2 #include <stdio.h> 3 #include <string.h> 4 #include <time.h> 5 #include <stdlib.h> 6 #include <iostream> 7  8 using namespace std ; 9 10 int a[1010][1010],b[1010][1010],c[1010][1010] ;11 int d[1010],c1[1010],d1[1010],ans[1010] ;12 13 int main()14 {15     int n ;16     while(~scanf("%d",&n))17     {18         for(int i = 0 ; i < n ; i++)19             for(int j = 0 ; j < n ; j++)20                 scanf("%d",&a[i][j]) ;21         for(int i = 0 ; i < n ; i++)22             for(int j = 0 ; j < n ; j++)23                 scanf("%d",&b[i][j]) ;24         for(int i = 0 ; i < n ; i++)25             for(int j = 0 ; j < n ; j++)26                 scanf("%d",&c[i][j]) ;27         srand((unsigned int)time(0));28         for(int i=0; i<n; i++)29         {30             d[i]=rand()%100;31         }32         for(int i = 0 ; i < n ; i++)33             for(int j = 0 ; j < n ; j++)34             {35                 d1[i] += b[i][j]*d[j] ;//二维乘一维等于一维,一维乘二维等于二维36                 c1[i] += c[i][j]*d[j] ;37             }38         for(int i = 0 ; i < n ; i++)39             for(int j = 0 ; j < n ; j++)40                 ans[i] += a[i][j]*d1[j] ;41         bool flag = false ;42         for(int i = 0 ;  i < n ; i++)43             if(ans[i] != c1[i])44             {45                 flag = true ;46                 break ;47             }48         if(!flag)49             printf("YES\n") ;50         else printf("NO\n") ;51     }52     return 0 ;53 }
View Code