成绩 | 10 | 开启时间 | 2018年03月24日 星期六 13:30 |
折扣 | 0.8 | 折扣时间 | 2018年12月24日 星期一 13:30 |
允许迟交 | 否 | 关闭时间 | 2018年12月24日 星期一 13:30 |
输入:
共两行
第一行 N ( 1<=N<=100 ),代表矩阵个数。
第二行有 N+1 个数,分别为 A1 、 A2 ...... An+1 ( 1<=Ak<=2000 ), Ak 和 Ak+1 代表第 k 个矩阵是个 Ak X Ak+1 形的。
输出:
共两行
第一行 M ,为最优代价。注:测试用例中 M 值保证小于 2^31
第二行为最优顺序。如 (A1((A2A3)A4)) ,最外层也加括号。
注意:测试用例已经保证了输出结果唯一,所以没有AAA的情况.
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
int m[105][105];
int p[105];
int s[105][105];
int n;
int solve(int i, int j)
{
for (int i = 1; i <= n; i++) m[i][i] = 0;
for (int r = 1; r <= n - 1;r++)//两个矩阵相差的个数
for (int i = 1; i <= n - r; i++)
{
int j = i + r;
s[i][j] = i;
//m[i][j] = 0x7f7f7f7f;
m[i][j] = m[i][i] + m[i + 1][j] + p[i - 1] * p[i] * p[j];
for (int k = i+1; k < j; k++)
{
int tmp = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (m[i][j]>tmp)
{
m[i][j] = tmp;
s[i][j] = k;
}
}
}
return m[1][n];
}
void TrackPrint(int i,int j)
{
if (i == j)
{
cout << 'A' << i;
return;
}
cout << '(';
TrackPrint(i, s[i][j]);
TrackPrint(s[i][j] + 1, j);
cout << ')';
}
int main()
{
//freopen("1.txt", "r", stdin);
cin >> n;
if (n == 1)//特判
{
printf("0\n");
printf("(A1)\n");
return 0;
}
for (int i = 0; i <=n; i++)
cin >> p[i];
cout << solve(1,n) << endl;
TrackPrint(1, n);
cout << endl;
return 0;
}