动态规划——最大值

来源:互联网 发布:和明星合影软件 编辑:程序博客网 时间:2024/04/30 23:26

Description

给你一个表达式,你可以通过在不同的地方添加括号从而改变式子的结果。比如1 + 2 * 3,如果是(1+2)*3结果是9,如果是1+2*3,结果是7,现在给你一个这样的式子,保证只有乘法和加法,但是也许会出现负数,求出这个式子通过不同的加括号方式,所能求得的最大结果。

Input

多组数据,每组数据第一行给出一个整数N(2<=N<=100),是所给式子的整数个数,下面包含表达式,所有整数和符号之间都会相隔一个空格。

Output

对于每组测试数据输出一个给出式子能算出的最大值。

Sample Input

4
1 + 2 * 3 + -1

Sample Output

8

思路引导

   类似矩阵连乘

解题报告

   用Max[i][j]表示子式将第i个整数到第j个整数加上一层括号能够得到的最大值。这样最终的结果就是max[1][n].

 

源代码:

#include<stdio.h>
#define Max 100000   //Max代表子式的最大值初始值
#define Min -100000  //Min代表子式的最小值初始值
#define SUM 105   //表达式中数字的最大个数
int n;     //数据测试组数
int num[SUM],   //存放运算数
 ope[SUM];   //存放运算符

struct rem{    //表示子式值的结构体
 int max;
 int min;
};
rem result[SUM][SUM];

rem cmp(int a1,int a2,int a3,int a4)
{
 int max,min;
 int temp=0;
 max=Min;
 min=Max;
 if((temp=a1*a3)>max)
  max=temp;
 if(temp<min)
  min=temp;
 if((temp=a1*a4)>max)
  max=temp;
 if(temp<min)
  min=temp;
 if((temp=a2*a3)>max)
  max=temp;
 if(temp<min)
  min=temp;
 if((temp=a2*a4)>max)
  max=temp;
 if(temp<min)
  min=temp;
 rem p;
 p.max=max;
 p.min=min;
 return p;
}
rem MAX(int i,int j)
{
 if(i==j)
 {
  result[i][j].max=num[i];
  result[i][j].min=num[i];
  return result[i][j];
 }
 if(i<j)
 {
  if(result[i][j].max!=Min)
   return result[i][j];
  else{
   for(int t=i;t<j;t++)
   {
    rem tempa = MAX(i,t);
    rem tempb = MAX(t+1,j);
    if(ope[t]==1)
    {
     rem c=cmp(tempa.max,tempa.min,tempb.max,tempb.min);
     if(c.max>result[i][j].max)
      result[i][j].max=c.max;
     if(c.min<result[i][j].min)
      result[i][j].min=c.min;
    }
    else
    {
     int mm=tempa.max+tempb.max;
     if(mm>result[i][j].max)
      result[i][j].max=mm;
     int mi=tempa.min+tempb.min;
     if(mi<result[i][j].min)
      result[i][j].min=mi;
    }
   }
   return result[i][j];
  }
 }
}


int main()
{
 int i,j;
 char ch;
 while(scanf("%d",&n)!=EOF)
 {
  for(i=1;i<n;i++)
  {
   scanf("%d",&num[i]);
   getchar();
   scanf("%c",&ch);
   if(ch=='*')
    ope[i]=1;
   else
    ope[i]=0;

  }
  scanf("%d",&num[n]);
  for(i=0;i<=n;i++)
   for(j=0;j<=n;j++)
   {
    result[i][j].max=Min;
    result[i][j].min=Max;
   }
  int max=MAX(1,n).max;
  printf("%d\n",max);
 }
 return 0;
}

 

原创粉丝点击