链接: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/description/
题面
给定一个只包含加、减和乘法的数学表达式,求通过加括号可以得到多少种不同的结果。
解法
利用分治思想,将加括号转化为,对于每个运算符号,先执行处理两侧的表达式,在进行符号的计算。
比如对于 2 * 3 - 4 * 5
对于第一个乘号,处理完左边的2
和右边的3 - 4 * 5
后把结果进行相乘
用递归的方式可以很好的处理这一问题
其实当时也有点感觉 但是没写出来
是一道很好的题目
分治写法后发现某个字符串可能被计算了很多次,因此可以使用记忆化的方法进行优化
分治+记忆化又可以写成动态规划
设计状态dp[i][j]表示第i个数字到第j个数字能组成的所有结果
dp[i][j]可以从中间的每一个运算符两端的表达式dp[i][k]和dp[k + 1][j]转移而来
细节见代码
代码
分治做法
1 | class Solution { |
dp做法
1 | class Solution { |