矩阵连乘 和表达式加括号求最大值

 矩阵连乘核心代码1 for(int i=0;i<=n;i++)
 2     m[i][j]=0;
 3 for(r=1;r<n;r++)
 4     for(i=1;i<=n-r;i++)
 5     {
 6         j=i+r;
 7         m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
 8         s[i][j]=i;
 9         for(k=i+1;k<j;k++)
10         {
11             int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
12             if(t<m[i][j])
13             {
14                 m[i][j]=t;
15                 s[i][j]=k;
16             }
17         }
18     }

表达式求最大值

  1 /*
  2     Name:
  3     Copyright:
  4     Author:
  5     Date: 13/08/14 22:32
  6     Description:
  7     矩阵连乘
  8     A1*A2*……An
  9     m[i][j]表示AI到AJ这个整体的矩阵的最大值  m[i][i]=0;
 10     设他们在K处断开。
 11     则有m[i][j]=m[i][k]+m[k+1][j]+p(i-1)*pi*pj;i<=k<j;
 12     现在给出一个表达式,运算符号只有+  *,运算对象为整数。
 13     加括号求最大值
 14 */
 15 #include"iostream"
 16 #include"cstring"
 17 #include"algorithm"
 18 #include"cstdio"
 19 using namespace std;
 20 #define SUM 101
 21 #define MAX 0x7fffffff
 22 #define MIN -0x7fffffff
 23 int n,num[SUM],ope[SUM],a[4];
 24 struct rem{
 25     int max;
 26     int min;
 27 };
 28 rem result[SUM][SUM];
 29 rem cmp(int a1,int a2,int b1,int b2)
 30 {
 31     int i=0;
 32     int max=MIN,min=MAX,tmp;
 33     if((tmp=a1*b1)>max)
 34         max=tmp;
 35     if(tmp<min)
 36         min=tmp;
 37     if((tmp=a1*b2)>max)
 38         max=tmp;
 39     if(tmp<min)
 40         min=tmp;
 41     if((tmp=a2*b1)>max)
 42         max=tmp;
 43     if(tmp<min)
 44         min=tmp;
 45     if((tmp=a2*b2)>max)
 46         max=tmp;
 47     if(tmp<min)
 48         min=tmp;
 49     rem p;
 50     p.max=max;
 51     p.min=min;
 52     return p;
 53 }
 54 rem maxv(int i,int j)
 55 {
 56     if(i==j)
 57     {
 58         result[i][j].max=num[i];
 59         result[i][j].min=num[i];
 60         return result[i][j];
 61     }
 62     if(i<j)
 63     {
 64         if(result[i][j].max!=MIN)
 65             return result[i][j];
 66         else
 67         {
 68             for(int t=i;t<j;t++)
 69             {
 70                 rem tmpa=maxv(i,t);
 71                 rem tmpb=maxv(t+1,j);
 72                 if(ope[t]==1)
 73                 {
 74                     rem c=cmp(tmpa.max,tmpa.min,tmpb.max,tmpb.min);
 75                     if(c.max>result[i][j].max)
 76                         result[i][j].max=c.max;
 77                     if(c.min<result[i][j].min)
 78                         result[i][j].min=c.min;
 79                 }
 80                 else
 81                 {
 82                     int mm=tmpa.max+tmpa.max;
 83                     if(mm>result[i][j].max)
 84                         result[i][j].max=mm;
 85                     int mi=tmpa.min+tmpb.min;
 86                     if(mi<result[i][j].min)
 87                         result[i][j].min=mi;
 88                 }
 89             }
 90             return result[i][j];
 91         }
 92     }
 93 }
 94 int main()
 95 {
 96     char ch;
 97     while(scanf("%d",&n)!=EOF)
 98     {
 99         for(int i=1;i<n;i++)
100         {
101             scanf("%d",&num[i]);
102             getchar();
103             scanf("%c",&ch);
104             if(ch==‘*‘)
105                 ope[i]=1;
106             else
107                 ope[i]=0;
108         }
109         scanf("%d",&num[n]);
110         for(int i=0;i<=n;i++)
111             for(int j=0;j<=n;j++)
112             {
113                 result[i][j].max=MIN;
114                 result[i][j].min=MAX;
115             }
116         int max=maxv(1,n).max;
117         printf("%d\n",max);
118     }
119     return 0;
120 }

矩阵连乘 和表达式加括号求最大值,布布扣,bubuko.com

时间: 2024-10-18 13:41:07

矩阵连乘 和表达式加括号求最大值的相关文章

矩阵乘法——多矩阵连乘请记得加括号

数学上,矩阵乘法满足结合率,因此  $ (AB)C=A(BC)$  在计算结果上是一样的. 但是在计算效率上,它们是不一样的. 举个简单的例子 $\alpha {\alpha ^T}\alpha$ $(\alpha {\alpha ^T})\alpha$需要$2{n^2}$次运算 而 $\alpha ({\alpha ^T}\alpha )$只要$2n$次运算 因此,在进行多矩阵连乘时,需要加上适当的括号.

【转】JavaScript eval处理JSON数据 为什么要加括号

由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐地流行起来,进而出现的问题是如何将服务器端构建好的JSON数据转化为可用的JavaScript对象.利用eval函数无疑是一种简单而直接的方法.在转化的时候需要将JSON字符串的外面包装一层圆括号:var jsonObject = eval("(" + jsonFormat + ")");为什么要加括号?加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号

中缀表达式转后缀表达式(用于求字符串表达式值)(js栈和队列的实现是通过数组的push和unshift方法插值,pop方法取值)

中缀表达式:就是我通常用的算术或逻辑公式: 后缀表达式:不包含括号,运算符放在两个运算对象后面,所有的计算按运算符出现的顺序,严格从左向右进行,不用考虑运算符优先级: 如,(2+1)*3 转换后,2 1 + 3 * 1.人工实现转换 如中缀表达式:a+b*c-(d+e) (1).按照运算符优先级对所有运算单位加括号,式子变成:((a+(b*c))-(d+e)) (2).把运算符号移动到对应括号后面,变成:((a(bc)*)+(de)+)- (3).把括号去掉就变成后缀表达式了:abc*+de+-

JS中eval处理JSON数据 为什么要加括号

由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐地流行起来,进而出现的问题是如何将服务器端构建好的JSON数据转化为可用的JavaScript对象.利用eval函数无疑是一种简单而直接的方法.在转化的时候需要将JSON字符串的外面包装一层圆括号: var jsonObject = eval("(" + jsonFormat + ")"); 为什么要加括号? 加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制

一道贪心:加括号使算式的值最大

问题描述 给定一个算术表达式形如1+3-5-4+6,表达式中的运算数全部都是正数,运算符全部是加号或者减号. 现在可以给算术表达式加任意多的括号,使得表达式的值最大. 如对于1+3-6-9+4-5-7+8,可以1+3-(6-9)+4-(5-7)+8,最优的方案是1+3-(6-9+4-5-7)+8 数据格式 T 例子个数 n1 第一个例子的运算数个数 1+3-6-9+4-5-7+8 算数表达式 n2 ...... 输出一个数字,表示表达式的最大值. 数据范围:运算数个数为1e5. 解析 最优答案中

c语言:宏里面参数不加括号容易出错,在使用时尽量加括号及举例

宏里面参数不加括号容易出错,在使用时尽量加括号 程序1: #include<stdio.h> #define SQARE(X) X*X int main() { int  n = 10; int m=SQARE(n); printf("m=%d\n",m); return 0; } 结果: m=100 请按任意键继续. . . 分析:貌似没有出问题,请看下面两个例子 程序2: #include<stdio.h> #define SQARE(X) X*X int 

关于JS中的方法是否加括号的问题

js中的方法什么时候加括号什么时候不加括号呢,我们有时候经常就搞不清楚,记住下面这几点就好理解了. 1.函数做参数时都不要加括号. function fun(a){ alert(a); } function getE(fun,e){ fun(e); } getE(fun,3);//弹出3,这里把函数fun当成实参传入,所以就不用加括号了. 2.函数调用的时候是要加括号的,上面这个例子中getE这个函数调用的时候,不管有没有参数,都是要加括号的. 3.函数作为赋值符号右边的时候,无括号表示的是传递

new对象时,类名后加括号与不加括号的区别

[1]默认构造函数 关于默认构造函数,请参见随笔<类中函数> 请看测试代码: 1 #include <iostream> 2 using namespace std; 3 4 // 空类 5 class empty 6 { 7 }; 8 9 // 一个默认构造函数,一个自定义构造函数 10 class Base 11 { 12 public: 13 Base() 14 { 15 cout << " default Base construct " &

关于vue ,v-on 绑定事件时,函数名加括号和不加括号的区别

作者:DDFE链接:https://www.zhihu.com/question/55753541/answer/146504270来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 从官方的文档 事件处理器 - Vue.js 中可以看出通过 `v-on` 中既可以执行一段代码.一个方法.内联 JavaScript 语句,根据不同的情况 Vue 会做不同的处理,具体可以从源码中可以看出(2.1.10版本),在编译阶段,会根据抽象HTML语法树生成代码,从 https: