您的位置:首页 > 产品设计 > UI/UE

zoj1276 Optimal Array Multiplication Sequence(DP)

2011-08-17 13:26 197 查看
/* 矩阵连乘,区间动态规划 */
/*
状态:DP[ l ][ s ] ——以 s 开始长度为 l 的区间的 矩阵乘积的最小值
阶段:区间长度
决策:DP[ l ][ s ] = min( DP[ k ][ s ] + DP[ l-k ][ s+k ] + 乘法代价 ) {1<k<l}
*/

View Code

#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

struct node
{
int R,C;
}X[ 11 ];

int DP[ 11 ][ 12 ];
int DI[ 11 ][ 12 ];

void print( int l, int s )
{
if ( l > 1 ) {
cout << "(";
print( DI[ l ][ s ], s );
cout << " x ";
print( l-DI[ l ][ s ], s+DI[ l ][ s ] );
cout << ")";
}else cout << "A" << s;
}

int main()
{
int n,t = 1;
while ( cin >> n && n ) {
for ( int i = 1 ; i <= n ; ++ i )
cin >> X[ i ].R >> X[ i ].C;

memset( DP, 0, sizeof( DP ) );
for ( int l = 2 ; l <= n ; ++ l )
for ( int s = 1 ; s+l-1 <= n ; ++ s ) {
DP[ l ][ s ] = 0xffffff;
for ( int k = 1 ; k < l ; ++ k ) {
int Temp = DP[ k ][ s ] + DP[ l-k ][ s+k ] + X[ s ].R*X[ s+k ].R*X[ s+l-1 ].C;
if ( DP[ l ][ s ] > Temp ) {
DP[ l ][ s ] = Temp;
DI[ l ][ s ] = k;
}
}
}
//cout << DP[ n ][ 1 ] << endl;
cout << "Case " << t ++ << ": ";
print( n, 1 );
cout << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: