• 动态规划——矩阵链相乘


    /**
     * @brief MatrixChainMultiplication  Algorithm 15.2
     * @author An
     * @data  2013.8.25                                                                  
    **/
    
    #include <iostream>
    #include <limits>
    #define  N 6
    using namespace std;
    
    static int **m = new int*[N];
    static int **s = new int*[N];
    // static int *p = new int[N];
    
    void MatrixChainOrder( int *p )
    {
    	for ( int i = 0; i != N; ++i )
    	{
    		m[i] = new int[N];
    		s[i] = new int[N];
    	}
    
    	for ( int i = 0; i != N; ++i )
    	{
    		for ( int j = 0; j != N; ++j )
    		{
    			m[i][j] = 0;
    			s[i][j] = 0;
    		}
    	}
    
    	for ( int i = 0; i != N; ++i )
    	{
    		m[i][i] = 0;
    	}
    
    	for ( int l = 2; l <= N; ++l )
    	{
    		for ( int i = 0; i != N - l + 1; ++i )
    		{
    			int j = i + l - 1;
    			m[i][j] = INT_MAX;
    			for ( int k = i; k != j; ++k )
    			{
    				int q = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1]; // p+1
    				if ( q < m[i][j] )
    				{
    					m[i][j] = q;
    					s[i][j] = k;
    				}
    			}
    		}
    	}
    
    }
    
    void PrintOptimalParens( int **ss, int i, int j )
    {
    	if ( i == j )
    	{
    		cout << "A" << i + 1;
    	}
    	else
    	{
    		cout << "(";
    		PrintOptimalParens( ss, i, s[i][j] );
    		PrintOptimalParens( ss, s[i][j] + 1, j );
    		cout << ")";
    	}
    }
    
    void PrintMatrix( int **Ma, int length )
    {
    	for ( int i = 0; i != length; ++i )
    	{
    		for ( int j = 0; j != length; ++j )
    		{
    			cout << Ma[i][j] << " ";
    		}
    		cout << endl;
    	}
    	cout << endl;
    }
    
    int main()
    {
    	int *p = new int[N + 1];
    	int a[] = { 30, 35, 15, 5, 10, 20, 25 };
    	for ( int i = 0; i != N + 1; ++i )
    	{
    		p[i] = a[i];
    	}
    
    
    	MatrixChainOrder( p );
    	PrintOptimalParens( s, 0, N - 1);
    
    	cout << endl;
    	PrintMatrix( m, N );
    	PrintMatrix( s, N );
    
    	return 0;
    }
    
    
    


  • 相关阅读:
    sql server分布式事务解决方案 (笔记)
    深入理解Datatable(笔记)
    SQLSERVER 2005 实现文件读写操作
    局部变量、全局变量、堆、堆栈、静态和全局
    分布式事务DISTRIBUTED TRANSACTION
    SQLSEVER2005中找不到存储过程xp_getfiledetails 解决办法
    模式窗口
    理解析构函数的执行过程
    Oracle分页
    DataTable导出到Excel、GSV (转)
  • 原文地址:https://www.cnblogs.com/james1207/p/3281355.html
Copyright © 2020-2023  润新知