矩阵乘法
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;
}