10344 矩阵连乘积的加括号方式数

时间秒杀一切 提交于 2020-01-10 00:57:45

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];
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!