分治和自顶向下动态规划算法
来源:互联网 发布:人工智能框架 编辑:程序博客网 时间:2024/09/21 09:17
Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are+
,-
and*
.
Example 1
Input: "2-1-1"
.
((2-1)-1) = 0(2-(1-1)) = 2
Output: [0, 2]
Example 2
Input: "2*3-4*5"
(2*(3-(4*5))) = -34((2*3)-(4*5)) = -14((2*(3-4))*5) = -10(2*((3-4)*5)) = -10(((2*3)-4)*5) = 10
Output: [-34, -14, -10, -10, 10]
解题的思路是分治算法,比如上面的2*3-4*5
让str1 = 2 *3,str2 = 4 × 5;如此,变为str1 - str2,把一个问题分解成了两个规模更小的子问题。
自顶向下动态规划算法:用一个hash表保存问题与解集的映射,如果次问题已经出现过,直接查找hash表,反之求解,并把解集放如hash表。
#include<vector>#include<string>#include<unordered_map>using namespace std;class Solution { unordered_map<string,vector<int>> map;public: vector<int> diffWaysToCompute(string input) { return divide(input); } vector<int> divide(const string& str){ if(map.find(str) != map.end()) return map[str]; vector<int> res; for(int i = 0; i < str.size(); ++i){ char ch = str[i]; if(isOpperator(ch)){ string sub1 = str.substr(0,i); string sub2 = str.substr(i+1); vector<int> v1 = divide(sub1); vector<int> v2 = divide(sub2); vector<int> v = genrate(v1,v2,ch); for(int each: v) res.push_back(each); } } if(res.empty()) res.push_back(atoi(str.data())); map[str] = res; return res; } bool isOpperator(char c){ return c == '+' || c == '-' || c =='*'; } vector<int> genrate(const vector<int>& a,const vector<int>& b,char c){ vector<int> res; for(int i = 0; i < a.size(); ++i){ for(int j = 0; j <b.size(); ++j){ int val; if(c == '+') val = a[i] + b[j]; else if(c =='-') val = a[i] - b[j]; else if(c == '*') val = a[i] * b[j]; res.push_back(val); } } return res; }};
0 0
- 分治和自顶向下动态规划算法
- 自顶向下分治实现的归并算法
- 动态规划-3.1.3矩阵连乘问题之备忘录方法(自顶向下)
- 动态规划中的钢条切割的介绍与理解(自顶向下递归和自底向上递归四种包含C源代码)
- 分治法——自顶向下,逐步求精
- C++数据结构--自顶向下和自底向上的动态编程思想
- 分治,动态规划和贪婪算法
- 分治法、动态规划和贪心算法
- LeetCode 70. Climbing Stairs 自顶向下记忆化搜索,自底向上重叠子问题动态规划
- 红黑树 自底向上和自顶向下插入, 自顶向下删除
- 自顶向下,精益求精
- 自顶向下
- 自顶向下设计
- 归并排序—自底向上和自顶向下
- 自顶向下测试和自底向上测试
- 自顶向下和自底向上测试的优缺点
- 伸展树(splay tree)自顶向下的算法
- 后缀数组的自顶向下(top-down)遍历算法
- java 特种兵笔记:论道 unilay
- StringBuffer字符串缓冲区
- Unix/linux进程及线程间同步技术总结【学习总结,请勿吐槽。。。】
- Android 实例:通过自定义View组件实现跟随手指移动的小兔子
- JDK动态代理浅析
- 分治和自顶向下动态规划算法
- 8.3CSS代码缩写 颜色值
- 黑马程序员----SQL约束介绍
- 如何在spring mvc中上传图片并显示出来
- 布局篇(一)各类元素居中显示
- 写给自己的逗比翻身计划
- 信道复用
- 3、C语言和设计模式(之单件模式)
- Linux互通SSH免密码访问