首页 > 代码库 > 矩阵连乘 和表达式加括号求最大值

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

 矩阵连乘核心代码
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             else107                 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 }