当前位置: 首页 > news >正文

动态规划:矩阵连乘问题

下面仅仅是对此问题的一个代码实现,详细理论部分请參见王晓东《算法设计与分析》第23.1节 矩阵连乘问题。

#include <iostream>
#include <iomanip>


using namespace std;

#define MAX_COUNT			20

//矩阵属性
struct tagMatrixAttribute
{
	int row;
	int col;
};

//矩阵连乘加括号求解
void MatrixChain( tagMatrixAttribute mMatrix[], int nCount,
				 int m[][MAX_COUNT], int s[][MAX_COUNT] )
{
	for ( int i = 0; i < nCount; ++i ) m[i][i] = 0;

	for ( int r = 1; r < nCount; ++r )
	{
		for ( int i = 0; i < nCount - r; ++i )
		{
			int j = i + r;
			//从k处断开,i <= k < j
			int k = i;
			m[i][j] = m[i][k] + m[k+1][j] 
			+ mMatrix[i].row * mMatrix[k].col * mMatrix[j].col;
			s[i][j] = k;
			int nTemp = 0;
			for( k = i + 1; k < j; ++k )
			{
				nTemp = m[i][k] + m[k+1][j] 
				+ mMatrix[i].row * mMatrix[k].col * mMatrix[j].col;
				if ( nTemp < m[i][j] )
				{
					m[i][j] = nTemp;
					s[i][j] = k;
				}
			}
		}
	}
}

//构造结果 
void TraceBack( int s[][MAX_COUNT], int i, int j )
{
	if ( i == j ) 
	{
		cout << "A" << i+1;
		return;
	}

	cout << "(";
	TraceBack( s, i, s[i][j] );
	TraceBack( s, s[i][j]+1, j );
	cout << ")";
}


void PrintArray( int nArray[][MAX_COUNT], int nCount )
{
	cout << left;
	for( int i = 0; i < nCount; ++i )
	{
		for ( int j = 0; j < nCount; ++j )
		{
			cout << setw(7) << nArray[i][j] << " ";
		}
		cout << endl;
	}
	cout << right;
}


int main()
{
	tagMatrixAttribute mMatrixAttrArray[] = {
		30, 35,
		35, 15,
		15, 5,
		5, 10,
		10, 20,
		20, 25
	};
// 	tagMatrixAttribute mMatrixAttrArray[] = {
// 		10, 100,
// 		100, 5,
// 		5, 50
// 	};
	int nCount = _countof( mMatrixAttrArray );

	int m[MAX_COUNT][MAX_COUNT];
	int s[MAX_COUNT][MAX_COUNT];
	memset( m, 0, sizeof(m) );
	memset( s, 0, sizeof(s) );

	MatrixChain( mMatrixAttrArray, nCount, m, s );

	PrintArray( m, nCount );
	cout << endl;

	PrintArray( s, nCount );
	cout << endl;

	//构造结果
	TraceBack( s, 0, nCount-1 );
	cout << endl;

	return 0;
}




作者:山丘儿
转载请标明出处。谢谢。

原文地址:http://blog.csdn.net/s634772208/article/details/46683087


相关文章:

  • 嵌入式 uboot、fs、kernel制作和烧录简记-hi3518c
  • http_load
  • Object传入String类型和其他
  • centos 命令集合
  • 一种节省空间的交换变量的基本算法
  • 腾讯优测携手开源中国码云平台提供安卓项目质量一键分析
  • Git 更新操作
  • 嵌入式Linux系统运行流程图
  • Hybrid App 和 React Native 开发那点事
  • 归并排序(Merge Sort)
  • 装B技能GET起来!Apple Pay你会用了吗?
  • Tcp实现简单的大小写转换功能
  • uboot里读sd卡内容
  • Redis 主从复制
  • printk打印指针变量
  • avalon2.2的VM生成过程
  • CSS实用技巧
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS基础之数据类型、对象、原型、原型链、继承
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Python爬虫--- 1.3 BS4库的解析器
  • vue总结
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何解决微信端直接跳WAP端
  • 试着探索高并发下的系统架构面貌
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 在Unity中实现一个简单的消息管理器
  • 阿里云API、SDK和CLI应用实践方案
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • (06)Hive——正则表达式
  • (4)STL算法之比较
  • (C语言)逆序输出字符串
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (四)c52学习之旅-流水LED灯
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Net 知识杂记
  • .NET处理HTTP请求
  • .NET企业级应用架构设计系列之开场白
  • .NET委托:一个关于C#的睡前故事
  • .net下的富文本编辑器FCKeditor的配置方法
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @JoinTable会自动删除关联表的数据
  • @media screen 针对不同移动设备
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [Android] Upload package to device fails #2720