表达式加括号分段

2024-06-09 21:08
文章标签 分段 括号 表达式

本文主要是介绍表达式加括号分段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

解答要求
时间限制:1000ms, 内存限制:64MB
输入
第一行输入一个整数n(2<=n<=100),是所给式子的整数个数,下面包含表达式,所有整数和符号之间都会相隔一个空格,所给整数的绝对值小于1000.

输出
输出一个式子能算出的最大值(不超过int).

样例
输入样例 1 复制

4
1 + 2 * 3 + -1
输出样例 1

8

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>typedef struct TagDp {int maxValue;int minValue;
} Dp;enum {SUCCESS = 0,FAIL = 1,ZERO = 0,ONE = 1,TWO = 2,PLUS = '+',MULTI = '*'
};#define MAXITEM 100
#define MAXVALUE 2147367600int g_data[MAXITEM];
Dp g_dp[MAXITEM][MAXITEM];
char g_op[MAXITEM];
int g_dataNum;int InputData()
{int res = scanf_s("%d", &g_dataNum);if (res <= ZERO) {return FAIL;}int i = 0;while (i < g_dataNum) {res = scanf_s("%d", &g_data[i]);if (i == g_dataNum - ONE) {break;}if (res > ZERO) {res = getchar();}g_op[i] = getchar();if (g_op[i] != PLUS && g_op[i] != MULTI) {return FAIL;}++i;}return SUCCESS;
}void InitDp()
{for (int i = 0; i < g_dataNum; ++i) {for (int j = 0; j < g_dataNum; ++j) {if (i == j) {g_dp[i][i].maxValue = g_data[i];g_dp[i][i].minValue = g_data[i];} else {g_dp[i][j].maxValue = INT_MIN;g_dp[i][j].minValue = INT_MAX;}}}
}Dp GetEle(int minmin, int minmax, int maxmin, int maxmax)
{Dp result;int min1, max1;if (minmin < minmax) {min1 = minmin;max1 = minmax;} else {min1 = minmax;max1 = minmin;}int min2, max2;if (maxmin < maxmax) {min2 = maxmin;max2 = maxmax;} else {min2 = maxmax;max2 = maxmin;}result.maxValue = max1 > max2 ? max1 : max2;result.minValue = min1 < min2 ? min1 : min2;return result;
}Dp GetExpressValue(Dp left, Dp right, int op)
{Dp result;int minmin = left.minValue;int minmax = left.minValue;int maxmin = left.maxValue;int maxmax = left.maxValue;if (op == PLUS) {result.minValue = minmin + right.minValue;result.maxValue = maxmax + right.maxValue;} else {minmin *= right.minValue;minmax *= right.maxValue;maxmin *= right.minValue;maxmax *= right.maxValue;result = GetEle(minmin, minmax, maxmin, maxmax);}return result;
}int main()
{int res = InputData();if (res != SUCCESS) {return res;}InitDp();Dp temp;for (int i = g_dataNum - 1; i >= 0; --i) {  // 从后往前计算,保证使用时已经计算过for (int j = i + 1; j < g_dataNum; ++j) {for (int k = i; k < j; ++k) {temp = GetExpressValue(g_dp[i][k], g_dp[k + 1][j], g_op[k]);g_dp[i][j].maxValue = temp.maxValue > g_dp[i][j].maxValue ? temp.maxValue : g_dp[i][j].maxValue;g_dp[i][j].minValue = temp.minValue < g_dp[i][j].minValue ? temp.minValue : g_dp[i][j].minValue;}}}int maxValue = g_dp[0][g_dataNum - 1].maxValue;printf("%d", maxValue);return 0;
}

这篇关于表达式加括号分段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046306

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采

将浮点型算式的中缀表达式转换成后缀表达式并算出式子结果

最近因为需要了解如何将在Win应用程序控制台输入的算式表达式转化成其后缀表达式的算法,所以在网上搜索了一下,看到许多人的程序都只是对应于运算数在0~9的范围内的整型运算式,所以自己就写了一个可以计算浮点型算式的程序,一下是运行时的截图: 式子中的a,b,c是可供用户自行输入的变量。 首先,我先对输入的运算符进行了简单的合法性判断,我的判断代 码如下: //函数的传入参

括号匹配问题(nyoj2)

括号配对问题 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 3 描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"