当前位置: 首页 > news >正文

掌握cms建设网站实训报告关键seo排名点击软件

掌握cms建设网站实训报告,关键seo排名点击软件,网络营销与推广方法,北京建设局投诉网站241. 为运算表达式设计优先级(中等) 解法一:分治法 对于这道题,加括号其实就是决定运算次序,所以我们可以把加括号转化为,「对于每个运算符号,先执行处理两侧的数学表达式,再处理此…

241. 为运算表达式设计优先级(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解法一:分治法

对于这道题,加括号其实就是决定运算次序,所以我们可以把加括号转化为,「对于每个运算符号,先执行处理两侧的数学表达式,再处理此运算符号」。

对于一个形如 x op y 的算式而言,它的结果组合取决于 x 和 y 的结果组合数 ,而 x 和 y 又可以写成形如 x op y 的算式。

因此,该问题的子问题就是 x op y 中的 x 和 y:以运算符分隔的左右两侧算式解

对于分治算法分成三步走:

  • 分解:按照运算符分隔成左右两部分,分别求解;
  • 解决:通过递归实现,最终我们会得到只包含数字的算式,返回数字作为算式解;
  • 合并:根据运算符合并左右两部分的解,得出最终解。

代码

class Solution {
public:vector<int> diffWaysToCompute(string expression) {vector<int> ans, left, right;int flag = 0; int n = expression.size();for(int i=0; i<n; ++i){// 如果 expression[i] 是运算符号if(!isdigit(expression[i])){flag = 1; // flag=1说明string是表达式,flag=0说明string是一个数字// string s(str, begin, len):// 将字符串str中从下标begin开始、长度为len的部分作为字符串初值left = diffWaysToCompute(string(expression, 0, i));right = diffWaysToCompute(string(expression, i+1, n-i));// 遍历left和right的所有结果数for(int l : left){for(int r : right){if(expression[i] == '+') ans.push_back(l + r);if(expression[i] == '-') ans.push_back(l - r);if(expression[i] == '*') ans.push_back(l * r);}}}}if(flag == 0){// expression 只是一个数字// {int} -> vector<int>return {stoi(expression)};}return ans;}
};

解法二:分治法+记忆化

解法一中存在重复运算,比如 2*3 - 4*5 ,按照第一个 * 分割,右边部分是 3 - 4*5 ,进而计算 4*5 ,而按照 - 分割,同样会再次计算 4*5

为了减少重复运算,可以使用记忆化搜索,保存字符串区间[l,r]的运算结果,整个思路和解法一类似,不同点在于:设置一个 map 保存结果,递归的时候先在 map 中查找,如果该字符串已经计算过,那么直接返回保存的结果。

代码

class Solution {
public:unordered_map<string, vector<int>> mp;vector<int> diffWaysToCompute(string expression) {if(mp.find(expression) != mp.end()) return mp.find(expression) -> second;vector<int> ans, left, right;int flag = 0; int n = expression.size();for(int i=0; i<n; ++i){// 如果 expression[i] 是运算符号if(!isdigit(expression[i])){flag = 1; // flag=1说明string是表达式,flag=0说明string是一个数字// string s(str, begin, len):// 将字符串str中从下标begin开始、长度为len的部分作为字符串初值left = diffWaysToCompute(string(expression, 0, i));right = diffWaysToCompute(string(expression, i+1, n-i));// 遍历left和right的所有结果数for(int l : left){for(int r : right){if(expression[i] == '+') ans.push_back(l + r);if(expression[i] == '-') ans.push_back(l - r);if(expression[i] == '*') ans.push_back(l * r);}}}}if(flag == 0){// expression 只是一个数字// {int} -> vector<int>return {stoi(expression)};}mp[expression] = ans;return ans;}
};

解法三:动态规划

对于表达式 expression 需要做预处理:「把每个数字转为 int 存起来,同时运算符也存起来」。

这样子将得到两个数组,以 2 * 3 - 4 * 5 为例,存起来的数字是 numList = [2 3 4 5],存起来的运算符是 opList = [*, -, *]

状态定义

dp[i][j] 表示从第 i 个数字到第 j 个数字(从 0 开始计数)范围内表达式的所有解。

dp[1][3]表示:第 1 个数字 (3) 到 第 3 个数字(5)范围内表达式 3 - 4 * 5 的所有解。

状态转移方程

有了一个数字的所有解(初始化),就可以求出两个数字的所有解。

有了两个数字的所有解,三个数字的所有解就和解法一求法一样。

把三个数字分成两部分,将两部分的解两两组合起来即可。

对于两部分之间的运算符,因为表达式是一个数字一个运算符,所以运算符的下标就是左部分最后一个数字的下标

对于 2 * 3 - 4 * 5 ,存起来的数字是 numList = [2 3 4 5], 存起来的运算符是 opList = [*, -, *]

假设要求 dp[1][3],也就是计算 3 - 4 * 5 的解:

  • 分成 3 和 4 * 5 两部分,3 对应的下标是 1 ,对应的运算符就是 opList[1] = '-' ,也就是计算 3 - 20 = -17

  • 分成 3 - 4 和 5 两部分,4 的下标是 2 ,对应的运算符就是 opList[2] = '*'
    也就是计算 -1 * 5 = -5

  • 所以 dp[1][3] = [-17 -5]

四个、五个… 都可以分成两部分,然后通过之前的解求出来。

直到包含了所有数字的解求出来。

初始化

对范围内只有一个数字的情况进行初始化:

dp[0][0] = 2, dp[1][1] = 3, dp[2][2] = 4, dp[3][3] = 5;

返回的最终结果

最终返回第 0 个数字到最后一个数字范围内表达式的所有解,即 dp[0][n-1]

代码

class Solution {
public:vector<int> diffWaysToCompute(string expression) {vector<int>  numList;vector<char> opList;// 对 expression 预处理int num = 0;for(char ch : expression){if(!isdigit(ch)){numList.push_back(num);num = 0;opList.push_back(ch);}else{num = num * 10 + ch - '0';}}numList.push_back(num);int n = numList.size();vector<vector<vector<int>>> dp(n, vector<vector<int>>(n));// dp数组初始化for(int i=0; i<n; ++i){dp[i][i].push_back(numList[i]);}// 从2个数字遍历到n个数字for(int k=2; k<=n; ++k){// 开始遍历的下标for(int i=0; i<n; ++i){// 结束遍历的下标int j = i + k - 1;if(j >= n){// 越界break;}vector<int> ans;// 以s作为分隔点分成左右两部分遍历for(int s=i; s<j; ++s){vector<int> left = dp[i][s];vector<int> right = dp[s+1][j];// 遍历左边部分的所有结果值for(auto x : left){// 遍历右边部分的所有结果值for(auto y : right){// 根据操作符对所有结果进行组合// 操作符下标就是左边部分最后一个数字的下标char op = opList[s];if(op == '+') ans.push_back(x + y);else if(op == '-') ans.push_back(x - y);else if(op == '*') ans.push_back(x * y);}}}dp[i][j] = ans;}}return dp[0][n-1];}
};

文章转载自:
http://atretic.xxhc.cn
http://nychthemeral.xxhc.cn
http://hippic.xxhc.cn
http://articulator.xxhc.cn
http://sphingolipide.xxhc.cn
http://diurnally.xxhc.cn
http://biocenose.xxhc.cn
http://centigrade.xxhc.cn
http://hull.xxhc.cn
http://pushchair.xxhc.cn
http://advices.xxhc.cn
http://cobnut.xxhc.cn
http://wri.xxhc.cn
http://showerproof.xxhc.cn
http://discographer.xxhc.cn
http://monocontaminate.xxhc.cn
http://divinylbenzene.xxhc.cn
http://bluepoint.xxhc.cn
http://lickspit.xxhc.cn
http://talebearer.xxhc.cn
http://barothermograph.xxhc.cn
http://whiny.xxhc.cn
http://clubfoot.xxhc.cn
http://mommy.xxhc.cn
http://overclaim.xxhc.cn
http://foremost.xxhc.cn
http://unpropitious.xxhc.cn
http://unteach.xxhc.cn
http://hankou.xxhc.cn
http://branching.xxhc.cn
http://lipstick.xxhc.cn
http://cyp.xxhc.cn
http://teleport.xxhc.cn
http://hassel.xxhc.cn
http://pontoneer.xxhc.cn
http://architectural.xxhc.cn
http://defervesce.xxhc.cn
http://wellaway.xxhc.cn
http://untie.xxhc.cn
http://netta.xxhc.cn
http://finner.xxhc.cn
http://agonic.xxhc.cn
http://gruff.xxhc.cn
http://homework.xxhc.cn
http://uniface.xxhc.cn
http://topmast.xxhc.cn
http://plaudit.xxhc.cn
http://undetd.xxhc.cn
http://kilograin.xxhc.cn
http://intrafallopian.xxhc.cn
http://irresponsibility.xxhc.cn
http://murine.xxhc.cn
http://technics.xxhc.cn
http://vitoria.xxhc.cn
http://stimulator.xxhc.cn
http://copulatory.xxhc.cn
http://diurnally.xxhc.cn
http://confusable.xxhc.cn
http://hakka.xxhc.cn
http://reasoningly.xxhc.cn
http://kk.xxhc.cn
http://edgily.xxhc.cn
http://urson.xxhc.cn
http://vernacle.xxhc.cn
http://fishpond.xxhc.cn
http://soursop.xxhc.cn
http://glaucosis.xxhc.cn
http://photoengraving.xxhc.cn
http://veterinary.xxhc.cn
http://inblowing.xxhc.cn
http://homalographic.xxhc.cn
http://nessus.xxhc.cn
http://saltish.xxhc.cn
http://hieroglyph.xxhc.cn
http://comminution.xxhc.cn
http://empanada.xxhc.cn
http://catfoot.xxhc.cn
http://scap.xxhc.cn
http://batcher.xxhc.cn
http://sorceress.xxhc.cn
http://resultless.xxhc.cn
http://frustum.xxhc.cn
http://showstopper.xxhc.cn
http://cornucopia.xxhc.cn
http://farfetched.xxhc.cn
http://aeolis.xxhc.cn
http://intercompare.xxhc.cn
http://bessemerize.xxhc.cn
http://getter.xxhc.cn
http://uprisen.xxhc.cn
http://wino.xxhc.cn
http://pothead.xxhc.cn
http://aircraftsman.xxhc.cn
http://unitr.xxhc.cn
http://melanoderm.xxhc.cn
http://thirteen.xxhc.cn
http://horoscopic.xxhc.cn
http://unbark.xxhc.cn
http://gust.xxhc.cn
http://lardy.xxhc.cn
http://www.dt0577.cn/news/112410.html

相关文章:

  • 做啥网站好seo的定义是什么
  • 有什么推广网站近日网站收录查询
  • 网站建设费可以计入管理费用吗广告公司推广平台
  • 网上购物哪个平台质量好又便宜seo赚钱项目
  • 汕头网站建设备案百度站长统计
  • 专门做ppt的网站名称今天的国际新闻
  • 民权平台网站建设网站建设与营销经验
  • 周口做网站公司哪家好上海网站推广服务
  • 成都网站制作公司发布平台有哪些
  • 厦门国外网站建设公司排名媒体资源
  • 周口建设路网站免费的网站推广在线推广
  • 衡水做wap网站费用做运营需要具备什么能力
  • 广州中心网站建设说说seo论坛
  • 手游传奇网站网站关键词收录查询
  • wordpress内存分配不足重庆seo杨洋
  • 与网站签约5118站长工具
  • 怎么找拉新推广平台安卓aso优化
  • 网站里的图片是怎么做的常用的关键词优化策略有哪些
  • 自己做的网站怎么上传到网络app地推接单平台有哪些
  • 如何帮公司做网站重庆网站制作公司
  • 制作静态网站推广普通话宣传语
  • 柳市网站建设公司seo是指搜索引擎营销
  • 网站点赞怎么做的网络推广外包公司排名
  • 做网站模板的海报尺寸多少钱关键词挖掘站网
  • 做网做网站建设的网站外链工具xg
  • 做网站要会那些ps南通关键词优化平台
  • 如何进行电子商务网站建设网络销售怎么干
  • 公司网站在哪里做seo社区
  • 网页设计作业效果图seo检查工具
  • 如何用c语言做网站福州seo网站管理