uva:348 - Optimal Array Multiplication Sequence

12 篇文章 0 订阅

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=284

矩阵乘法问题,区间dp。动规方程为:f[i][j] = min{ f[i][k] + f[k+1][j] + p[i] * q[k] * q[j] } (k>=i && k < j)。其中f[i][j] 表示的是区间[i ,j ]内的最优值。p[i]表示矩阵i的行,q[i]表示矩阵i的列。递推的时候采用区间j-i的长度来一次递推。这样比较容易计算以及状态的转移。代码如下:

/*
ID; csuanchen
PROG: 348 Optimal Array Multiplication Sequence
LANG: C++
*/

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std ;

#define INF 100000000

const int maxn = 15 ;

int martix[maxn][2] ;
int dp[maxn][maxn] ;
int fl[maxn][maxn] ;

int n ;

void print(int left , int right) ;

int main()
{
	int test ;
	test = 0 ;
	
	while(cin>>n && n)
	{
		int i ;
		int j ;
		int len ;
		int k ;
		
		memset(martix , 0 , sizeof(martix)) ;
		memset(dp , 0 , sizeof(dp)) ;
		memset(fl , 0 , sizeof(fl)) ;
		
		for(i = 0 ; i < n ; i ++)
			cin>>martix[i][0]>>martix[i][1] ;
		
		for(len = 1 ; len <= n ; len ++)
		{
			for(i = 0 ; i <= n - len ; i ++)
			{
				j = i + len - 1 ;
				
				dp[i][j] = INF  ;
				
				if(i == j )
					dp[i][j] = 0 ;
					
				for(k = i ; k < j ; k ++)
				{
					int temp = dp[i][k] + dp[k + 1][j] + martix[i][0] * martix[k][1] * martix[j][1] ;
					
					if(dp[i][j] > temp)
					{
						dp[i][j] = temp ;
						fl[i][j] = k ;
					}
				}
			}
		}
		cout<<"Case "<<++test<<": ";
		print(0 , n - 1) ;	
		cout<<endl ;
	}
	
	return 0 ;
}

void print(int left , int right)
{

	if(left!=right)
	{
		cout<<"(" ;
		
		print(left , fl[left][right]) ;
		cout<<" x " ;	
		print(fl[left][right] + 1 , right) ;
		
		cout<<")" ;
	}
	
	else if( left == right && left != n - 1 )
		cout<<"A"<<left + 1;
	else if( left == right && left == n - 1 )
		cout<<"A"<<right + 1 ;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值