动态规划——最大值
来源:互联网 发布:和明星合影软件 编辑:程序博客网 时间: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;
}
- 动态规划——最大值
- 动态规划——数对之差的最大值
- 动态规划 表达式最大值
- 经典动态规划——HDU1024 m段子段和的最大值
- 动态规划——什么是动态规划?
- 动态规划 python 实现 三角形最大值路径
- 动态规划 — LIS
- 动态规划——Relocation 动态规划+状态压缩
- 动态规划——序
- 算法——动态规划
- 算法——动态规划
- 动态规划——猴子
- POJ1036——动态规划
- 算法——动态规划
- 动态规划——hdu1003
- 算法——动态规划
- 算法——动态规划
- 动态规划——背包
- jquery常见问题总结
- 真机测试及布署Code Sign error问题总结
- 两张结构一样的表如何找不同的记录:UNION - UNION ALL - INTERSECT - MINUS / EXCEPT
- Android客户端和服务器交互
- 黑马程序员—Java 反射
- 动态规划——最大值
- andoid的智能指针
- Java 查找方法(普通查找,二分查找)
- 我们该如何设计数据库(三)
- 服务员-dp
- 如何避免扩展同名函数或宏
- C# using的用法
- 单源最短路径、最小生成树及堆的Java实现
- HDU 2137 circumgyrate the string