10344 矩阵连乘积的加括号方式数
时间限制:800MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC;JAVA
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
代码实现
#include <iostream>
#include <vector>
using namespace std;
vector<int> memo;
int P(int n) {
if (n == 1)
return 1;
if (memo[n] != -1)
return memo[n];
int result = 0;
for (int k = 1; k < n; k++)
result += P(k) * P(n - k);
memo[n] = result;
return result;
}
int main() {
int n;
cin >> n;
memo.resize(n + 1, -1);
cout << P(n);
return 0;
}