UVa348 - Optimal Array Multiplication Sequence
2014-01-28 16:36
281 查看
Optimal Array Multiplication Sequence |
![](http://uva.onlinejudge.org/external/3/348img13.gif)
![](http://uva.onlinejudge.org/external/3/348img1.gif)
![](http://uva.onlinejudge.org/external/3/348img2.gif)
![](http://uva.onlinejudge.org/external/3/348img3.gif)
![](http://uva.onlinejudge.org/external/3/348img4.gif)
![](http://uva.onlinejudge.org/external/3/348img1.gif)
![](http://uva.onlinejudge.org/external/3/348img5.gif)
![](http://uva.onlinejudge.org/external/3/348img6.gif)
![](http://uva.onlinejudge.org/external/3/348img7.gif)
![](http://uva.onlinejudge.org/external/3/348img8.gif)
![](http://uva.onlinejudge.org/external/3/348img9.gif)
![](http://uva.onlinejudge.org/external/3/348img10.gif)
![](http://uva.onlinejudge.org/external/3/348img11.gif)
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 integer N which indicates the number of arrays tobe 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 indicatesthe end of the input. N will be no larger than 10.Output
Assume the arrays are named![](http://uva.onlinejudge.org/external/3/348img12.gif)
Sample Input
3 1 5 5 20 20 1 3 5 10 10 20 20 35 6 30 35 35 15 15 5 5 10 10 20 20 25 0
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))
一道要求输出方案的区间DP题,用记忆化DP可以很好地分析清楚状态
for(int i = st; i <= ed-1; i++) ans = min(ans,dfs(st,i)+dfs(i+1,ed)+vn[st].x*vn[i].y*vn[ed].y);
输出方案的时候主要递归输出即可
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <string>#include <algorithm>#include <queue>#include <sstream>using namespace std;const int INF = 1e9;int n;struct node{int x,y;string name;};vector<node> vn;int dp[20][20];void init(){vn.clear();vn.resize(n);memset(dp,-1,sizeof dp);}void input(){for(int i = 0; i < n; i++){stringstream ss;ss<<i+1;vn[i].name = "A"+ss.str();scanf("%d%d",&vn[i].x,&vn[i].y);}}int dfs(int st,int ed){if(st==ed) return 0;if(dp[st][ed]!=-1) return dp[st][ed];int ans = INF;for(int i = st; i <= ed-1; i++) ans = min(ans,dfs(st,i)+dfs(i+1,ed)+vn[st].x*vn[i].y*vn[ed].y);return dp[st][ed] = ans;}void getsol(int st,int ed){if(st==ed){cout<<vn[st].name;return;}int k = st;int ans = INF;for(int i = st; i <= ed-1; i++)if(ans>dfs(st,i)+dfs(i+1,ed)+vn[st].x*vn[i].y*vn[ed].y){ans = dfs(st,i)+dfs(i+1,ed)+vn[st].x*vn[i].y*vn[ed].y;k = i;}if(st!=k) printf("(");getsol(st,k);if(st!=k) printf(")");printf(" x ");if(ed!=k+1)printf("(");getsol(k+1,ed);if(ed!=k+1)printf(")");}void solve(){int ans = dfs(0,n-1);printf("(");getsol(0,n-1);printf(")");cout<<endl;}int main(){int T = 1;while(cin >> n&&n){init();input();printf("Case %d: ",T++);solve();}return 0;}[/code]
相关文章推荐
- UVA 348 Optimal Array Multiplication Sequence
- uva 348 Optimal Array Multiplication Sequence
- UVA 348 - Optimal Array Multiplication Sequence
- UVa 348 - Optimal Array Multiplication Sequence
- UVa 348: Optimal Array Multiplication Sequence
- UVA 348 Optimal Array Multiplication Sequence(区间dp)
- UVA 348 - Optimal Array Multiplication Sequence
- uva 348 - Optimal Array Multiplication Sequence
- UVA - 348 Optimal Array Multiplication Sequence (最优矩阵连乘)
- UVA - 348 Optimal Array Multiplication Sequence
- UVa 348 Optimal Array Multiplication Sequence (DP 最优矩阵链乘)
- uva 348 - Optimal Array Multiplication Sequence
- UVA 348 Optimal Array Multiplication Sequence
- UVa 348 Optimal Array Multiplication Sequence (DP 最优矩阵链乘)
- UVa 348 Optimal Array Multiplication Sequence
- uva 348 - Optimal Array Multiplication Sequence
- UVa 348 - Optimal Array Multiplication Sequence
- uva 348 - Optimal Array Multiplication Sequence
- uva348 - Optimal Array Multiplication Sequence
- uva 348 - Optimal Array Multiplication Sequence