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)即可。 另外,此题需要注意的是,如果你写的纯递归程序可能会超时的,因为这里递归存在重复,且重复数量庞大。 需要用数组将你算过的元素存储下来,避免重复的递归计算,这样优化后,才能通过。
我的代码实现
1 #include<stdio.h> 2 3 #define N 30 4 int p[N], m[N][N]; 5 6 7 void MatrixCatalan(int n){ 8 for(int i=0;i<n;i++)p[i]==0; 9 p[1]=1; 10 for(int i=2;i<=n;i++){ 11 for(int k=1;k<n;k++){ 12 m[k][i-k]=p[k]*p[i-k]; 13 p[i]+=m[k][i-k]; 14 } 15 } 16 } 17 18 19 int main(){ 20 int n; 21 scanf("%d",&n); 22 MatrixCatalan(n); 23 printf("%d",p[n]); 24 return 0; 25 }