0
点赞
收藏
分享

微信扫一扫

H106OJ第三次练习

辰鑫chenxin 2022-04-03 阅读 67
c++

矩阵乘法

Description

有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。

两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r。

Input

输入的第一行包含一个整数n,表示矩阵的个数。

第二行包含n+1个数,表示给定的矩阵。

Output

输出一个整数,表示最少的运算次数。

Sample Input 1 

3
1 10 5 20

Sample Output 1

150

Hint

HINT:时间限制:3.0s 内存限制:256.0MB

1<=n<=1000, 1<=ai<=10000。

AC代码

#include<stdio.h>
#include <string.h> 
int r[50][50];
int s[50][50];
int t[50][50];

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	int i, j, k;

	//赋值
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			scanf("%d", &s[i][j]);
		}
	}
	for (i = 1; i <= n; i++)//初始化r
		r[i][i] = 1;

	while (m--)//m--先执行后减一
	{
		memset(t, 0, sizeof(t));//初始化数组t的元素全部为0,必须有这一步才能进行后面的求和操作
		for (i = 1; i <= n; i++)
		{
			for (j = 1; j <= n; j++)
			{
				for (k = 1; k <= n; k++)
				{
					t[i][j] += r[i][k] * s[k][j];//数组乘法规律
				}
			}
		}
		for (i = 1; i <= n; i++)//将数组t拷贝到数组r
		{
			for (j = 1; j <= n; j++)
				r[i][j] = t[i][j];
		}
	}
	//输出
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			printf("%d ", r[i][j]);
		}
		printf("\n");
	}
	return 0;
}
举报

相关推荐

H106OJ_第三次练习_去注释

H106OJ第二次练习

H106OJ | 凶手

Python第三次练习

H106OJ第四周练习

H106OJ带分数

H106OJ班级排名

H106OJ | 幸运数

H106OJ | 进制转换

第三次作业

0 条评论