Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 一种无附加条件的算术表达式_Algorithm_Computer Science_Dynamic Programming - Fatal编程技术网

Algorithm 一种无附加条件的算术表达式

Algorithm 一种无附加条件的算术表达式,algorithm,computer-science,dynamic-programming,Algorithm,Computer Science,Dynamic Programming,算术表达式可以有许多可能的值 有人能帮我吗 有一个动态规划解决方案 对于表达式,可以将其“最外面的拆分点”定义为不在任何括号内的第一个运算符。现在,在这个拆分之后,如果它位于+上,那么您需要最大化左子表达式和右子表达式;如果是-,则最大化左侧,最小化右侧 您可以使用动态规划或记忆来实现此算法。记忆很简单:搜索每个分割点,并将答案保存在另一个数据结构中(两个2D矩阵,用M[x][y]字符串表示表达式的最大/最小值,从x开始,在y结束);当数据在矩阵中时,使用它而不是重新计算 使用动态规划有点棘手,

算术表达式可以有许多可能的值


有人能帮我吗

有一个动态规划解决方案

对于表达式,可以将其“最外面的拆分点”定义为不在任何括号内的第一个运算符。现在,在这个拆分之后,如果它位于
+
上,那么您需要最大化左子表达式和右子表达式;如果是
-
,则最大化左侧,最小化右侧

您可以使用动态规划或记忆来实现此算法。记忆很简单:搜索每个分割点,并将答案保存在另一个数据结构中(两个2D矩阵,用
M[x][y]
字符串表示表达式的最大/最小值,从
x
开始,在
y
结束);当数据在矩阵中时,使用它而不是重新计算

使用动态规划有点棘手,但您可以这样想:

  • 首先,循环遍历表达式,找到每个连续2个值的最大/最小值,并在它们之间加上运算符(好吧,这是一种奇特的说法,只需计算它即可)
  • 循环遍历表达式,找到每个连续3个值的最大/最小值,并在它们之间加上运算符(对于
    a?b?c
    ,这是通过假设分割点在
    a
    b
    之间,假设分割点在
    b
    c
    上计算的,并存储这两个值的最大/最小值);
  • 知道所有
    k
    -长度序列的最大/最小值后,使用与步骤2中相同的方法计算
    k+1
    -长度序列,直到k是数组的长度,并返回长度
    k
    的最大值

  • 这几乎与算法相同,算法具有
    O(N^3)
    复杂性。通过推理可以粗略地证明其复杂性:您需要执行循环
    N-1
    次,每次最多执行
    N-1
    子序列,并且您最多需要尝试
    N-1
    拆分点。所以,
    N^3
    时间复杂性。

    您正在寻找一种特定的语言吗?您必须构建for循环并迭代可能的组合。您需要一个变量来跟踪最高和结果。每次迭代,你都会根据跟踪变量检查答案,如果它更大,就替换它。伪代码,我相信这是通过动态编程完成的。