首页 > 其他分享 >动态规划:矩阵连乘问题

动态规划:矩阵连乘问题

时间:2022-12-07 18:38:42浏览次数:45  
标签:连乘 COUNT cout int MAX 矩阵 nCount mMatrix 动态


以下只是对此问题的一个代码实现,具体理论部分请参见王晓东《算法设计与分析》第2版3.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;
}



动态规划:矩阵连乘问题_矩阵连乘


作者:山丘儿

标签:连乘,COUNT,cout,int,MAX,矩阵,nCount,mMatrix,动态
From: https://blog.51cto.com/u_15905375/5919887

相关文章

  • 动态规划总结
    动态规划算法动态规划算法,就是挖掘问题的条件,找到问题中各个状态的联系,通过列出状态转移方程,实现各个状态的计算。动态规划解题思路动态规划解题的核心是找到状态转移方......
  • 动态代理
    概述什么是动态代理使用JDK的反射机制,创建对象的能力,创建的是代理类的对象,不用自己创建类文件,不用写Java文件。动态:在程序执行时,调用JDK提供的方法才能创建代理......
  • 动态SQL遇到的问题
    看图    查不出来任何数据因为判断有问题修改方法如下: ......
  • android nativate 动态注册 静态注册
    说明:在java函数的入口比较容易分析,把activity的生命周期或者关键函数通过放在so层,分析起来就困难多了 1、在MainActivity中packagecom.demo.nativate;import......
  • Java通过JNA方式调用DLL(动态链接库)
    Java通过JNA方式调用DLL(动态链接库)1.JNA简单介绍先说JNI(JavaNativeInterface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进......
  • 打家劫舍(一) 动态规划
        import java.util.*;public class Solution {    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 ......
  • layui文件上传需要编写动态URL的时候需要重载方法
    varuploadInst=upload.render({elem:'#WebButton'/*,url:url//此处配置你自己的上传接口即可*/,auto:true......
  • C++_动态链接库和搜索共享库
    标准1998 C++982011 C++11ISO/IEC14882:2011 2014 C++142017 C++172020 ISOC++委员会正式发布了C++20标准,命名为ISO/IEC14882:2020 实现01.命令查看自己......
  • 动态获取配置文件
    首先是添加NuGet包依赖,主要依赖一下3个包Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.FileExtensionsMicrosoft.Extensions.Configuration.......
  • (转)Python中动态导入对象importlib.import_module()的使用
    背景一个函数运行需要根据不同项目的配置,动态导入对应的配置文件运行。解决文件结构a#文件夹│a.py│__init__.pyb#文件夹│b.py│__init__.py├─c#文件夹│......