51nod oj 1140 矩阵相乘结果的判断【矩阵的结合律】
2016-08-23 21:54
295 查看
题目链接:1140
1140 矩阵相乘结果的判断
题目来源: POJ
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
收藏
关注
给出三个N*N的矩阵A, B, C,问A * B是否等于C?
Input
Output
Input示例
Output示例
矩阵的乘法---为O(N^3)-----500^3=1.25*10^8--------超时
所以需要优化---通过矩阵的结合律可以将时间复杂度降到O(N^2)
构造一个行矩阵或者列矩阵X----1*n------
A*B==C 可以推出 X*A*B=X*C
而X*A的复杂度为1*N*N--------
为了保证程序的测定更准确---我们通过随机数来构造X----也可多构造几组X----
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long a1[2][520],a2[2][520],a3[2][520],a,kp[2][520];
int main()
{
int n;scanf("%d",&n);
for (int i=1;i<=n;i++)
{
kp[0][i]=rand()%10000+2;
kp[1][i]=rand()%10000+2;
}
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(a3,0,sizeof(a3));
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a1[0][j]+=kp[0][i]*a;
a1[1][j]+=kp[1][i]*a;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a2[0][j]+=a1[0][i]*a;
a2[1][j]+=a1[1][i]*a;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a3[0][j]+=kp[0][i]*a;
a3[1][j]+=kp[1][i]*a;
}
}
bool fafe=true;
for (int i=1;i<=n;i++)
if (a2[0][i]!=a3[0][i]||a2[1][i]!=a3[1][i])
{
fafe=false;
break;
}
printf("%s\n",fafe?"Yes":"No");
return 0;
}
1140 矩阵相乘结果的判断
题目来源: POJ
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
收藏
关注
给出三个N*N的矩阵A, B, C,问A * B是否等于C?
Input
第1行,1个数N。(0 <= N <= 500) 第2 - N + 1行:每行N个数,对应矩阵A的元素。(0 <= M[i] <= 16) 第N + 2 - 2N + 1行:每行N个数,对应矩阵B的元素。(0 <= M[i] <= 16) 第2N + 2 - 3N + 1行:每行N个数,对应矩阵C的元素。
Output
如果相等输出Yes,否则输出No。
Input示例
2 1 0 0 1 0 1 1 0 0 1 1 0
Output示例
Yes
矩阵的乘法---为O(N^3)-----500^3=1.25*10^8--------超时
所以需要优化---通过矩阵的结合律可以将时间复杂度降到O(N^2)
构造一个行矩阵或者列矩阵X----1*n------
A*B==C 可以推出 X*A*B=X*C
而X*A的复杂度为1*N*N--------
为了保证程序的测定更准确---我们通过随机数来构造X----也可多构造几组X----
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long a1[2][520],a2[2][520],a3[2][520],a,kp[2][520];
int main()
{
int n;scanf("%d",&n);
for (int i=1;i<=n;i++)
{
kp[0][i]=rand()%10000+2;
kp[1][i]=rand()%10000+2;
}
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(a3,0,sizeof(a3));
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a1[0][j]+=kp[0][i]*a;
a1[1][j]+=kp[1][i]*a;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a2[0][j]+=a1[0][i]*a;
a2[1][j]+=a1[1][i]*a;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a3[0][j]+=kp[0][i]*a;
a3[1][j]+=kp[1][i]*a;
}
}
bool fafe=true;
for (int i=1;i<=n;i++)
if (a2[0][i]!=a3[0][i]||a2[1][i]!=a3[1][i])
{
fafe=false;
break;
}
printf("%s\n",fafe?"Yes":"No");
return 0;
}
相关文章推荐
- 51nod 1140 矩阵相乘结果的判断
- 51Nod-1140-矩阵相乘结果的判断
- 51NOD 1140 矩阵相乘结果的判断(随机化算法+矩阵结合率)
- 51nod-1140-矩阵相乘结果的判断
- 51nod 1140 矩阵相乘结果的判断
- 51nod 1140 矩阵相乘结果的判断(矩阵结合律)
- 51nod 1140 矩阵相乘结果的判断
- [随机化 矩阵乘法] BZOJ 2396 神奇的矩阵 & 51Nod 1140 矩阵相乘结果的判断 & POJ 3318 Matrix Multiplication
- 矩阵相乘结果的判断
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 两数相乘结果溢出的判断
- 科普:矩阵乘法是怎么做的?怎么判断两个矩阵是否可以相乘?不使用行列式
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果