Comparing answers(矩阵降维+随机化思想)

题意:题意是有矩阵A,B,然后判断A*A ?= B ,直接做O(n*n*n)
分析:矩阵降维 A*A*C ?= B*C, C 是一维向量 运算顺序为 A*(A*C) 时间复杂度为O(N*N)
代码:

#include<bits/stdc++.h>
#define maxn 1100
using namespace std;
int n,A[maxn][maxn],B[maxn][maxn],X[maxn];
int A1[maxn],A2[maxn],B1[maxn];
int C[maxn];
//X*A*A=X*B
int main(){
    while(scanf("%d",&n)!=EOF){
        bool flag=true;
        memset(A1,0,sizeof(A1));
        memset(B1,0,sizeof(B1));
        memset(X,0,sizeof(X));
        if(n==0) break;
        for(int i=0;i<n;i++) {
            C[i]=rand()%9999;
            X[i]=C[i];
        }

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                scanf("%d",&A[i][j]);
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                scanf("%d",&B[i][j]);
            }
        }

        //计算x*A,保存在A1中 
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                A1[i]+=X[j]*A[i][j];
            }
        }
        //计算x*B,保存在B1中 
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                B1[i]+=X[j]*B[i][j];
            }
        } 
        //计算A1*A,保存在A2中 
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                    A2[i]+=A1[j]*A[i][j];
                }
            }

        //比较A2和B1大小 
        for(int i=0;i<n;i++){
            if(A2[i]!=B1[i]){
                flag=false;
                break;
            }
        } 

        if(flag) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/81811471
今日推荐