10344 矩阵连乘积的加括号方式数
时间限制:800MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
给定n个矩阵{A1,…,An},其中Ai和Ai+1可乘,i=1,2,…,n-1。考察矩阵连乘积加括弧的方式数。
如四个矩阵连乘积A1A2A3A4,共有五种不同的加括弧方式:
( A1 ( A2 ( A3 A4 ) ) )
( A1 ( ( A2 A3 ) A4 ) )
( ( A1A2 ) ( A3 A4 ) )
( A1 ( A2 A3 ) A4 )
( ( ( A1 A2 ) A3 ) A4 )
输入示例:
4
输出示例:
5
输入格式
输入矩阵连乘积的个数n(n<=20)。
输出格式
输出矩阵连乘积加括号的方式数。
输入样例
4
输出样例
5
提示
这个问题在书上3.1节(P46)有详细探讨。
对于n个矩阵的连乘积,设不同的计算次序(就是加括号方式数)为P(n)。假设最后一次括号加在第k个和第k+1个
(k=1…n-1)之间。
则P(n)的递归式如下:
P(n) = 1 if n=1;
P(n) = sum{ P(k)*P(n-k) | for k=1 to n-1 } if n>1
计算P(n)即可。
另外,此题需要注意的是,如果你写的纯递归程序可能会超时的,因为这里递归存在重复,且重复数量庞大。
需要用数组将你算过的元素存储下来,避免重复的递归计算,这样优化后,才能通过。
作者 zhengchan
Version: 3
没什么好说的,照着提示打
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int n=0;
int P(int a[]);
int main()
{
cin>>n;
int a[n+1];
for (int i = 0; i <=n ; i++) {
a[i]=0;
}
P(a);
}
int P(int a[]){
a[1]=1;
for (int i = 2; i <=n ; i++) {
for (int k = 1; k <n ; k++) {
a[i]+=a[k]*a[i-k];
}
}
cout<<a[n];
}
来源:CSDN
作者:dgpt
链接:https://blog.csdn.net/torisang/article/details/103331127