SHAOXIAOJ正在加载中...

2618: 动态规划-矩阵连乘积

金币值:3 定数:8 时间限制:1.000 s 内存限制:128 M
正确:4 提交:4 正确率:100.00% 命题人:
点赞量:0 收藏量:0 题目类型:程序 知识点: 算法设计

题目描述

给定 $n$($1\lt n \le 9$)个矩阵{$A$, $A_2$, …, $A_n$},其中 $A_i$ 与 $A_{i+1}$ 是可乘的,$i=1,…,n$。要求找到一个计算次序使得求 $n$ 个矩阵连乘积 $A_1$, $A_2$, …, $A_n$ 的数乘次数最少。 例如:如果有 $3$ 个矩阵,第 $1$ 个矩阵的行数和列数分别为 $1$ 和 $2$,第 $2$ 个矩阵的行数和列数分别为 $2$ 和 $3$,第 $3$ 个矩阵的行数和列数分别为 $3$ 和 $4$;如果先计算第 $1$ 个矩阵和第 $2$ 个矩阵的积(数乘次数为 $6=1 \times 2 \times 3$),然后再计算刚得到的结果矩阵( $1$ 行 $3$ 列)与第 $3$ 个矩阵的积(数乘次数为 $12=1 \times 3 \times 4$ ),总数乘的结果为 $18$;如果先计算第 $2$ 个矩阵和第 $3$ 个矩阵的积(数乘次数为 $24=2 \times 3 \times 4$),然后再计算第 $1$ 个矩阵与刚得到的结果矩阵($2$ 行 $4$ 列)的积(数乘次数为 $8=1 \times 2 \times4 $ ),总数乘的结果为 $32$。因为 $3$ 个矩阵的连乘积的计算方法只有上面两种情况,故最少的数乘次数为 $18$。

测试代码   复制

#include <stdio.h>

int m[11][11]; // 下标为0的单元“不存储”有效数据
int p[11]; // 注意:下标为0的单元“存储”有效数据

void MatrixChain(int p[],int n)
{
	for(int i=1;i<=n;i++) m[i][i]=0; //初始化第1条对角线(主对角线)			
	for(int r=2;r<=n;r++) //分别计算第r(此处没有使用变量p的原因是p已经作为形式参数了)条对角线上的值
	{
		for(int i=1;i<=n-r+1;i++)		
		{
			
		}
	}
}

int main(void)
{
	int i,n,result;
	scanf("%d",&n);		
	for(i=0;i<=n;i++) scanf("%d",&p[i]);
	MatrixChain(p,n);
	printf("%d\n",m[1][n]);
	return 0;
}

输入格式

第一行输入一个整数,表示有n个矩阵相乘
第二行输入n+1个整数,分别表示n个矩阵的行和列数。注意,相邻两个矩阵相乘的条件是前者的列数与后者的行数相等,故输入数据时省略了一个整数。

输出格式

第一行输出最小的数乘次数。

输入样例    复制

3
1 2 3 4

输出样例    复制

18

提示

算法设计思路:先写出计算m[i][j]值的递归式(与租用游艇问题非常相似),然后根据递归式设计动态规划算法。
如果是4个矩阵,下标分别是1,2,3,4,5,则结果应该是什么?