博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj1276 Optimal Array Multiplication Sequence(DP)
阅读量:5237 次
发布时间:2019-06-14

本文共 1595 字,大约阅读时间需要 5 分钟。

/* 矩阵连乘,区间动态规划 */

/*
 状态: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 
2 #include
3 #include
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

你可能感兴趣的文章
JDBC 时间处理
查看>>
hadopp 环境搭建
查看>>
【2018】听懂你能看懂的句子
查看>>
mybatis源代码分析:深入了解mybatis延迟加载机制
查看>>
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
【BZOJ3052】【UOJ#58】【WC2013】糖果公园(树上莫队)
查看>>
荷兰国旗问题
查看>>
Process 启动参数问题
查看>>
提高PHP性能的10条建议
查看>>
我,不会吵,不会闹,心痛了用沉默代替
查看>>
svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
查看>>
项目经理面试中可能遇到的问题(持续更新)
查看>>
【转】总结前端面试过程中最容易出现的问题
查看>>
Java- 简单了解线程 生产者与消费者问题(三)
查看>>
centos rancher 通过本机 docker images 新增container
查看>>
【原】PNG的使用技巧
查看>>
android studio 使用SVN 锁定文件,防止别人修改(基于Android studio 1.4 )
查看>>
4412 uboot启动分析
查看>>