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

 

你可能感兴趣的:(Matrix)