***uva 348 最优数组乘法序列(记忆化搜索+输出路径)
来源:互联网 发布:经济学研究生知乎 编辑:程序博客网 时间:2024/06/06 01:52
1、http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=284
2、最优矩阵链乘,详见刘汝佳算法入门经典P170
3、题目:
Optimal Array Multiplication Sequence
Given two arrays A and B, we can determine the array C =A Busing the standard definition of matrix multiplication:
The number of columns in the A array must be the same as the number of rows in theB array. Notationally, let's say that rows(A) and columns(A) are the number of rows and columns, respectively, in theA array. The number of individual multiplications required to compute the entireC array (which will have the same number of rows as A and the same number of columns asB) is then rows(A) columns(B) columns(A). For example, ifA is a array, andB is a array, it will take , or 3000 multiplications to compute theC array.
To perform multiplication of more than two arrays we have a choice of how to proceed. For example, ifX, Y, and Z are arrays, then to compute X Y Z we could either compute (X Y)Zor X (Y Z). Suppose X is a array,Y is a array, andZ is a array. Let's look at the number of multiplications required to compute the product using the two different sequences:
(X Y) Z
- multiplications to determine the product (X Y), a array.
- Then multiplications to determine the final result.
- Total multiplications: 4500.
X (Y Z)
- multiplications to determine the product (Y Z), a array.
- Then multiplications to determine the final result.
- Total multiplications: 8750.
Clearly we'll be able to compute (X Y) Z using fewer individual multiplications.
Given the size of each array in a sequence of arrays to be multiplied, you are to determine an optimal computational sequence. Optimality, for this problem, is relative to the number of individual multiplications required.
Input
For each array in the multiple sequences of arrays to be multiplied you will be given only the dimensions of the array. Each sequence will consist of an integerN which indicates the number of arrays to be multiplied, and then N pairs of integers, each pair giving the number of rows and columns in an array; the order in which the dimensions are given is the same as the order in which the arrays are to be multiplied. A value of zero for N indicates the end of the input.N will be no larger than 10.
Output
Assume the arrays are named . Your output for each input case is to be a line containing a parenthesized expression clearly indicating the order in which the arrays are to be multiplied. Prefix the output for each case with the case number (they are sequentially numbered, starting with 1). Your output should strongly resemble that shown in the samples shown below. If, by chance, there are multiple correct sequences, any of these will be accepted as a valid answer.
Sample Input
31 55 2020 135 1010 2020 35630 3535 1515 55 1010 2020 250
Sample Output
Case 1: (A1 x (A2 x A3))Case 2: ((A1 x A2) x A3)Case 3: ((A1 x (A2 x A3)) x ((A4 x A5) x A6))
4、AC代码:
#include<stdio.h>#include<string.h>#define N 15#define INF 0x7fffffffint dp[N][N];int path[N][N];struct node{ int x; int y;}a[N];void Printpath(int i,int j){ if(i==j) printf("A%d",i+1); else { printf("("); Printpath(i,path[i][j]); printf(" x "); Printpath(path[i][j]+1,j); printf(")"); }}int DP(int i,int j){ if(i>=j) return 0; if(dp[i][j]!=0) return dp[i][j]; dp[i][j]=INF; for(int k=i;k<j;k++) { int tmp=DP(i,k)+DP(k+1,j)+a[i].x*a[k].y*a[j].y; if(tmp<dp[i][j]) { dp[i][j]=tmp; path[i][j]=k; } } return dp[i][j];}int main(){ int n,cas=0; while(scanf("%d",&n)!=EOF) { cas++; if(n==0) break; for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y); memset(dp,0,sizeof(dp)); memset(path,0,sizeof(path)); int res=DP(0,n-1); printf("Case %d: ",cas); Printpath(0,n-1); printf("\n"); } return 0;}/*31 55 2020 135 1010 2020 35630 3535 1515 55 1010 2020 250*/
- ***uva 348 最优数组乘法序列(记忆化搜索+输出路径)
- NYOJ564 最优对称路径(记忆化搜索+spfa)
- 1106: 最优对称路径(最短路+记忆化搜索)
- uva348 最优数组乘法序列
- csu 1106 最优对称路径 最短路+记忆化搜索.
- csu 1106 最优对称路径(最短路+记忆化搜索)
- poj1192(记忆化搜索)最优连通子集
- NYOJ564 & CSU 1106 最优对称路径【记忆化搜索+最短路】
- uva 116 (记忆化搜索)
- uva 707 - Robbery(记忆化搜索)
- 记忆化搜索(跳舞机,uva 10618)
- 最优矩阵链乘 记忆化搜索
- uva 10285 记忆化搜索
- uva 707(记忆化搜索)
- uva 607 记忆化搜索
- uva 10118 记忆化搜索
- UVA 10285 记忆化搜索
- UVA 1630 记忆化搜索
- 在Kali Linux上安装cuda、pyrit-cuda以及optimus
- android使用webview上传文件(支持相册和拍照)
- layout使用ImageView控件里关于contentDescription属性的问题
- POJ2348+博弈
- HTMLParser
- ***uva 348 最优数组乘法序列(记忆化搜索+输出路径)
- hdu2197 本源串
- hdu(1276)士兵队列训练问题
- VS2005 编译的exe运行出现 0x00905a4d 处未处理的异常: 0xC0000005: 读取位置 0x00905a4d时发生访问冲突
- HDU 1279 验证角谷猜想
- java发送post和get请求(1)---HttpURLConnection方式
- oracle修改表字段的数据类型测试
- Django设置session的有效期
- 容器vector部分功能的实现