栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2021-10-12

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-12

动态规划——矩阵连乘

设第i个矩阵为Ai,将矩阵连乘积AiAi+1…Aj记为A[i:j].
求A[1:n]最少计算次序.
采用完全加括号,即在不同位置将矩阵连乘分割,比较分割后最优,求出最优值。分割位置k(1<=k

#include 
using namespace std;

//p存储 行列数,n=矩阵个数,m存矩阵最少乘次数(最优值),n存断开位置(最优解)
void MatrixChain( int *p, int n, int m[][100], int s[][100] ) {
    for( int i = 1; i <= n; i++ ) {
        m[i][i] = 0;	//对角线赋值为0,因为对角线表示单一矩阵,无最少乘次数
        s[i][i] = 0;	//同理,无断开位置
    }

    for( int r = 2; r <= n; r++ ) {		//r控制连乘时矩阵个数,r=2表示求两个矩阵最少乘
        for( int i = 1; i <= n - r + 1; i++ ) { //i表示开始矩阵位置
            int j = i + r - 1;	//连乘矩阵结束位置
            m[i][j] = m[i][i] + m[i + 1][j] + p[i - 1] * p[i] * p[j]; //断开位置在初始位置时的m
            //m[2][5]意思是 第2个矩阵到第5个矩阵(共4个矩阵)的连乘最少次数
            //同理	s[2][5]意思是 第2个矩阵到第5个矩阵(共4个矩阵)的最少断点
            s[i][j] = i;

            for( int k = i + 1; k < j; k++ ) { //断开位置 i<=k temp ) {
                    m[i][j] = temp;
                    s[i][j] = k;
                }
            }
        }
    }
}

void TraceBack( int i, int j, int s[][100] ) {
    if( i == j ) {
        return ;
    }

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

int main() {
    int p[100];
    int n;
    int m[100][100];
    int s[100][100];
    int count = 0;
    cin >> n;

    for( int i = 1; i <= n; i++ ) {
        cin >> p[count++];
        cin >> p[count];
    }

    MatrixChain( p, n, m, s );

    for( int i = 0; i <= n; i++ ) {
        for( int j = 0; j <= n; j++ ) {
            if( m[i][j] < 0 ) {
                printf( "t-1" );
            } else {
                printf( "t%2d", m[i][j] );
            }
        }

        cout << endl;
    }

    system( "pause" );
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/317134.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号