矩阵连乘问题

成绩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的情况.

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 6↵
  2. 30 35 15 5 10 20 25↵
以文本方式显示
  1. 15125↵
  2. ((A1(A2A3))((A4A5)A6))↵
1秒64M0














代码:

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值