UVAoj 348 - Optimal Array Multiplication Sequence
生活随笔
收集整理的這篇文章主要介紹了
UVAoj 348 - Optimal Array Multiplication Sequence
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /*
2 題意:矩陣相乘的最少的步數
3 dp[i][j]=min(dp[i][j], dp[i][k]+dp[k+1][j]+num[i-1]*num[k]*num[j]);
4 表示的是第i個矩陣到第j個矩陣相乘的最少步數
5 sign[i][j]表示的是第i個矩陣到第j個矩陣相乘的最少步數是由第i個矩陣到第sign[i][j]個矩陣相乘最少步數
6 和第sign[i][j]+1個矩陣到第j個矩陣相乘最少步數的得到的最小值!
7 */
8 #include<iostream>
9 #include<cstring>
10 #include<string>
11 #include<cstdio>
12 #include<algorithm>
13 using namespace std;
14 int dp[15][15];
15 int sign[15][15];
16 int num[15];
17 int ld[15], rd[15];
18 int n;
19
20 void dfs(int l, int r){//將[l,r]不斷分解成最優的子區間
21 if(sign[l][r]==0) return ;
22 ld[l]++;//l數字出現了多少次,就意味著出現了多少次區間作值為l,也就是出現了多少次左括號
23 rd[r]++;//同理r右側出現了多少次右括弧
24 dfs(l, sign[l][r]);
25 dfs(sign[l][r]+1, r);
26 }
27
28 void traceBack(){
29
30 memset(ld, 0, sizeof(ld));
31 memset(rd, 0, sizeof(rd));
32 dfs(1, n);
33 for(int i=1; i<=n; ++i){
34 while(ld[i]--) cout<<"(";
35 cout<<"A"<<i;
36 while(rd[i]--) cout<<")";
37 if(i!=n)
38 cout<<" x ";
39 }
40 cout<<endl;
41 }
42
43 void traceBackTmp(int l, int r){//這是用遞歸的形式寫的,將區間不斷縮小,打印(Ai x Aj)
44 if(l>r) return;
45 if(l==r) printf("A%d", l);
46 else{
47 printf("(");
48 traceBackTmp(l, sign[l][r]);
49 printf(" x ");
50 traceBackTmp(sign[l][r]+1, r);
51 printf(")");
52 }
53 }
54
55 int main(){
56 int cnt, count=0;
57 string s="";
58 s+=10;
59 cout<<s<<endl;
60 while(scanf("%d", &n) && n){
61 int u, v;
62 cnt=0;
63 scanf("%d%d", &num[cnt], &num[cnt+1]);
64 cnt+=2;
65 for(int i=2; i<=n; ++i){
66 scanf("%d%d", &u, &v);
67 num[cnt++]=v;
68 }
69 n=cnt-1;
70 memset(dp, 0x3f, sizeof(dp));
71 memset(sign, 0, sizeof(sign));
72 for(int i=1; i<=n; ++i)
73 dp[i][i]=0;
74 for(int x=2; x<=n; ++x)
75 for(int i=1; i+x-1<=n; ++i){
76 int j=i+x-1;
77 for(int k=i; k<j; ++k){
78 int tt=dp[i][k]+dp[k+1][j]+num[i-1]*num[k]*num[j];
79 if(dp[i][j]>tt){
80 dp[i][j]=tt;
81 sign[i][j]=k;
82 }
83 }
84 }
85
86 cout<<"Case "<<++count<<": ";
87 traceBack();
88
89 // cout<<"Case "<<++count<<": ";
90 // traceBackTmp(1, n);
91 // cout<<endl;
92 }
93 return 0;
94 }
?
轉載于:https://www.cnblogs.com/hujunzheng/p/3915841.html
總結
以上是生活随笔為你收集整理的UVAoj 348 - Optimal Array Multiplication Sequence的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么什么冒充小坦克什么的
- 下一篇: 大伯有滥砍乱罚案例会影响考部队文职吗