3318 Matrix Multiplication 随机算法

来源:互联网 发布:java搭建博客系统 编辑:程序博客网 时间:2024/06/06 11:04

题意:给出n阶方阵A,B和C,判断C是否为A和B的乘积。

方阵规模最大为500×500,若直接将A和B相乘,算法复杂度为O(n^3),肯定要超时。考虑采用随机算法,随机选取50000个项进行测试。

用马甲测试了一下,一次AC:3216K 1594MS,大号提交WA了3次……

代码如下:

  1. #include  <iostream>
  2. #include  <cstdlib>
  3. #include  <ctime>
  4. using  namespace  std;
  5. int   A[500][500], B[500][500];
  6. long  C[500][500];
  7. int  main()
  8. {
  9.     srand( (unsigned)time(NULL) ); 
  10.     
  11.     int   k, j, n;
  12.     int   r, c;
  13.     int   sum, flag;
  14.     
  15.     cin >> n;
  16.     
  17.     for (k = 0; k < n; ++k)
  18.     {
  19.         for (j = 0; j < n; ++j)
  20.         {
  21.             scanf("%d", &A[k][j]);
  22.         }
  23.     } 
  24.            
  25.     for (k = 0; k < n; ++k)
  26.     {
  27.         for (j = 0; j < n; ++j)
  28.         {
  29.             scanf("%d", &B[k][j]);
  30.         }
  31.     } 
  32.     
  33.     for (k = 0; k < n; ++k)
  34.     {
  35.         for (j = 0; j < n; ++j)
  36.         {
  37.             scanf("%d", &C[k][j]);
  38.         }
  39.     } 
  40.     
  41.     flag = 0;
  42.     
  43.     for (j = 0; j < 50000; ++j)
  44.     {
  45.         r = rand() % n;
  46.         c = rand() % n;
  47.         
  48.         sum = 0;
  49.         
  50.         for (k = 0; k < n; ++k)
  51.         {
  52.             sum += A[r][k] * B[k][c];
  53.         }
  54.         
  55.         if (sum != C[r][c])
  56.         {
  57.             flag = 1;
  58.             break;
  59.         } 
  60.     }    
  61.     
  62.     if (flag == 0)
  63.     {
  64.         cout << "YES" << endl;
  65.     }
  66.     else
  67.     {
  68.         cout << "NO" << endl;
  69.     }        
  70.     return  0;
  71. }    
原创粉丝点击