zoj1276 Optimal Array Multiplication Sequence(DP)

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

ContractedBlock.gif ExpandedBlockStart.gif View Code
 1 #include <iostream>
2 #include <cstdlib>
3 #include <cstring>
4
5 using namespace std;
6
7 struct node
8 {
9 int R,C;
10 }X[ 11 ];
11
12 int DP[ 11 ][ 12 ];
13 int DI[ 11 ][ 12 ];
14
15 void print( int l, int s )
16 {
17 if ( l > 1 ) {
18 cout << "(";
19 print( DI[ l ][ s ], s );
20 cout << " x ";
21 print( l-DI[ l ][ s ], s+DI[ l ][ s ] );
22 cout << ")";
23 }else cout << "A" << s;
24 }
25
26 int main()
27 {
28 int n,t = 1;
29 while ( cin >> n && n ) {
30 for ( int i = 1 ; i <= n ; ++ i )
31 cin >> X[ i ].R >> X[ i ].C;
32
33 memset( DP, 0, sizeof( DP ) );
34 for ( int l = 2 ; l <= n ; ++ l )
35 for ( int s = 1 ; s+l-1 <= n ; ++ s ) {
36 DP[ l ][ s ] = 0xffffff;
37 for ( int k = 1 ; k < l ; ++ k ) {
38 int Temp = DP[ k ][ s ] + DP[ l-k ][ s+k ] + X[ s ].R*X[ s+k ].R*X[ s+l-1 ].C;
39 if ( DP[ l ][ s ] > Temp ) {
40 DP[ l ][ s ] = Temp;
41 DI[ l ][ s ] = k;
42 }
43 }
44 }
45 //cout << DP[ n ][ 1 ] << endl;
46 cout << "Case " << t ++ << ": ";
47 print( n, 1 );
48 cout << endl;
49 }
50 }

转载于:https://www.cnblogs.com/-xiaobai-/archive/2011/08/17/2143013.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值