杭电OJ(HDOJ)4920题:Matrix multiplication(线性代数,矩阵相乘)
2014-12-02 22:02
447 查看
题意:
给出两个N*N的矩阵A,B。求出这两个矩阵的乘积C。为了防止展生大数,结果矩阵C的每个元素都模除3,其中保证1<=N<=800,0≤Aij,Bij≤109
示例输入:
1
0
1
2
0 1
2 3
4 5
6 7
示例输出:
0
0 1
2 1
解决方案:
题目是线性代数中的内容,只是A,B都是n*n的矩阵,矩阵C的i行j列元素就等于A的i行所有元素和B的j列所有元素的乘积和。提交给AC结果都是运算超时了,后来知道要优化运算次数,优化的地方好几个,最主要的都要是将乘数为0的乘法运算剔除掉,次要就是模除的优化。运算的时间复杂度就是O(n^3)。
给出两个N*N的矩阵A,B。求出这两个矩阵的乘积C。为了防止展生大数,结果矩阵C的每个元素都模除3,其中保证1<=N<=800,0≤Aij,Bij≤109
示例输入:
1
0
1
2
0 1
2 3
4 5
6 7
示例输出:
0
0 1
2 1
解决方案:
题目是线性代数中的内容,只是A,B都是n*n的矩阵,矩阵C的i行j列元素就等于A的i行所有元素和B的j列所有元素的乘积和。提交给AC结果都是运算超时了,后来知道要优化运算次数,优化的地方好几个,最主要的都要是将乘数为0的乘法运算剔除掉,次要就是模除的优化。运算的时间复杂度就是O(n^3)。
#include<stdio.h> #define m 3 int A[800][800],B[800][800],C[800][800]; int main() { int n,i,j,k,temp; while(scanf("%d",&n)!=EOF) { for(i=0; i<n; i++) for(j=0; j<n; j++) { scanf("%d",&temp); A[i][j]=temp%m; } for(i=0; i<n; i++) for(j=0; j<n; j++) { scanf("%d",&temp); B[i][j]=temp%m; } for(i=0; i<n; i++) for(j=0; j<n; j++) { C[i][j]=0; } for(i=0; i<n; i++)//控制C的行 { for(k=0; k<n; k++)//控制A的列,如果A[i][k]是0,0乘任务数为0,就不用相乘累加了 { if(A[i][k]==0) continue; for(j=0; j<n; j++)//控制C的列 C[i][j]+=A[i][k]*B[k][j]; } } for(i=0; i<n; i++) { printf("%d",C[i][0]%m); for(j=1; j<n; j++) { printf(" %d",C[i][j]%m); } printf("\n"); } } return 0; }
相关文章推荐
- HDOJ 题目4920 Matrix multiplication(矩阵相乘,优化)
- 杭电OJ(HDOJ)2041题:超级阶梯(规律递推,Fibonacci)
- HDU 4920 Matrix multiplication(简单矩阵相乘+技巧减少Mod次数)
- 杭电OJ 分数矩阵
- 杭电OJ(HDOJ)1047题:Integer Inquiry(大数操作——加运算)
- 【线性代数】矩阵相乘
- 杭电OJ(HDOJ)1019题:求多个整数的最小公倍数(数论)
- 杭电OJ(HDOJ)1029题:Ignatius and the Princess IV(数论)
- 杭电OJ(HDOJ)1392题:Surround the Trees(凸包问题)
- 华为oj矩阵相乘2
- 杭电OJ(HDOJ)1870题:愚人节的礼物
- HDOJ, 杭电1032, The 3n+1 problem. POJ, 北大OJ,1207....数学题。。又一发
- 杭电OJ(HDOJ)1016题:Prime Ring Problem(DFS问题)
- 杭电OJ(HDOJ)1032题:The 3n + 1 problem(穷举,水题)
- 杭电OJ(HDOJ)1862题:EXCEL排序(结构体sort)
- 杭电OJ(HDOJ)1018题:求n的阶乘位数(数学公式)
- 杭电OJ(HDOJ)1030题:Delta-wave
- HDU 4920 稀疏矩阵相乘
- 杭电OJ(HDOJ)1010题:Tempter of the Bone(DFS,迷宫求解)
- 杭电OJ(HDOJ)2095题:find your present (2)(数论)