矩阵连乘问题
Description
给定n个矩阵A1,A2,…,An,其中,Ai与Aj+1是可乘的,i=1,2,…,n-1。
你的任务是要确定矩阵连乘的运算次序,使计算这n个矩阵的连乘积A1A2…An时总的元素乘法次数达到最少。
例如:3个矩阵A1,A2,A3,阶分别为10×100、100×5、5×50,计算连乘积A1A2A3时按(A1A2)A3所需的元素乘法次数达到最少,为7500次。
Input
测试数据有若干组,每组测试数据有2行。
每组测试数据的第1行是一个整数n,(0<n<20),第2行是n+1个正整数p0、p1、p2、…、pn,这些整数不超过100,相邻两个整数之间空一格,他们表示n个矩阵A1,A2,…,An,的阶pi-1´pi,i=1,2,…,n。
输入直到文件结束。
Output
对输入中的每组测试数据,输出2行。先在一行上输出“Case #”,其中“#”是测试数据的组号(从1开始),再在第2行上输出计算这n个矩阵的连乘积A1A2…An时最少的总的元素乘法次数,再空一格,接着在同一行上输出矩阵连乘的添括号形式。
注意:最外层括号应去掉。
Sample Input
310 100 5 50450 10 40 30 5
Sample Output
Case 1 7500 (A1A2)A3 Case 2 10500 A1(A2(A3A4))
题解:
现在的我果然还只是个蒟蒻,dp一片混沌。。希望半年后我回头看时能豁然开朗吧0.0
dp最重要的是递推关系,递推关系如下:
对不起这个公式我是推不出来的。。我照着别人的公式推还推了半天。。
那么跨过了dp递推公式的难关,这个题还有一个难点是如何打印括号,
这里是使用递推进行括号匹配的。
(注意如果大于一个矩阵的话,递推公式会把最前面和最后面的括号也打出来,不符合题意,需要自己删除)
附上渣渣调了半天才过的AC Code:
小伙子好好学啊 真的要代码去新博客找找吧= =(一年前的代码 = =)