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相关推荐

  1. 矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence

    题目传送门 1 /* 2 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 3 矩阵连乘积问题,DP解决:状态转移方程: 4 dp[i][j] = min (dp[i][k] + dp[k+1] ...

  2. π-Algorithmist分类题目(3)

    原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(3) Probability ...

  3. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  4. 神牛笔记:吉林大学ACM总结(fennec)

    其实在北京比赛完的时候,我就想写了,不过还是早了点,直到上海比赛结束,大家的心中都不是太好受.郭老师有句话:你们这样做也是对的,不成功就成仁.让我的心也能安慰了不少. 我是从大一下学期开始接触ACM的 ...

  5. poj题目详细分类及算法推荐题目

    DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题  ...

  6. ACM POJ 题目分类(完整整理版本)

    DP: 1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题   ...

  7. POJ ZOJ题目分类

    POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...

  8. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

    水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一.基本算法:        (1)枚举 (1753,2965)       (2)贪心(13 ...

  9. PUK ACM题目分类

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

最新文章

  1. MyBatis点滴积累
  2. 中国汽车脚垫市场消费趋势与营销渠道分析报告2022版
  3. gradle的下载与环境变量配置
  4. 危机永远回来,只是什么时候的问题
  5. CPU高速缓存行对齐和代码优化
  6. C语言字符串函数大全
  7. 使用netkit搭pppoe服务器
  8. 每日算法系列【LeetCode 329】矩阵中的最长递增路径
  9. 学习笔记: 委托解析和封装,事件及应用
  10. DSOframer 的简单介绍和资源整理(2015-09-02重新整理)
  11. 关于坐标系的那些事-------------扯一扯坐标系的理论知识
  12. 网优测试软件苹果手机,手机端网优测试软件详细介绍
  13. oracle19c报价_Oracle 19C EM
  14. 概念数据模型、逻辑数据模型、物理数据模型详解
  15. 用友U8+V13.0安装步骤
  16. 感受Java的魅力——基于Java二维数组和if语句编制的税后工资计算方法
  17. 服务器winsxs文件夹怎么清理工具,win10系统winsxs文件夹清理的操作方法
  18. 栈(LIFO:后进先出)
  19. yum详细教程(理解、使用、yum源)
  20. Java笔记-面向对象(上)

热门文章

  1. python同时输出多个值_怎样在python中输出多个数组元素?
  2. docker nacos mysql nginx 集群一台
  3. Flowable 数据库表结构 ACT_HI_VARINST
  4. Sublime Text 3 快捷键总结(详细版本)
  5. Centos7 安装maven
  6. 中正则表达式详解_python :正则表达式/re库 超级详细de注释解释
  7. cygwin 远程连接linux,Cygwin解决Windows远程登录linux服务器
  8. C语言 extern - C语言零基础入门教程
  9. Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程
  10. BugkuCTF-PWN题pwn2-overflow超详细讲解