【数学】【记忆化搜索 】【动态规划】964. 表示数字的最少运算符

作者推荐

【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数

本文涉及知识点

动态规划汇总
数学 记忆化搜索

LeetCoce964表示数字的最少运算符

给定一个正整数 x,我们将会写出一个形如 x (op1) x (op2) x (op3) x … 的表达式,其中每个运算符 op1,op2,… 可以是加、减、乘、除(+,-,*,或是 /)之一。例如,对于 x = 3,我们可以写出表达式 3 * 3 / 3 + 3 - 3,该式的值为 3 。
在写这样的表达式时,我们需要遵守下面的惯例:
除运算符(/)返回有理数。
任何地方都没有括号。
我们使用通常的操作顺序:乘法和除法发生在加法和减法之前。
不允许使用一元否定运算符(-)。例如,“x - x” 是一个有效的表达式,因为它只使用减法,但是 “-x + x” 不是,因为它使用了否定运算符。
我们希望编写一个能使表达式等于给定的目标值 target 且运算符最少的表达式。返回所用运算符的最少数量。
示例 1:
输入:x = 3, target = 19
输出:5
解释:3 * 3 + 3 * 3 + 3 / 3 。表达式包含 5 个运算符。
示例 2:
输入:x = 5, target = 501
输出:8
解释:5 * 5 * 5 * 5 - 5 * 5 * 5 + 5 / 5 。表达式包含 8 个运算符。
示例 3:
输入:x = 100, target = 100000000
输出:3
解释:100 * 100 * 100 * 100 。表达式包含 3 个运算符。
提示:
2 <= x <= 100
1 <= target <= 2 * 108

分析

原理

表达式由若干个xn加减而成,n的范围[0,…)。具有如下性质:
一,对于任意n,不会同时存在加xn,同时减Xn。否则,将两者删除,运算符更少。
二,不会存在x个xn
a,不会存在x个x0,否则合并成x。运算符由2x-1,变成0。
b,n>0,不会存在x个xn,否则合并成xn+1运算符由n x-1降成n。
三,n一定大于等0。由于结果是整数,所有小数部分的和一定是整数。假定负数部分是x-i1 x-i2… x-im 。 i1到im升序。 如果 ∑ i : i 1 j \sum\Large_{i:i1}^{j} i:i1j(xi) < 1,则 ∑ i : i 1 j + 1 \sum\Large_{i:i1}^{j+1} i:i1j+1(xi)要么小于1,要么等于1。1 - ∑ i : i 1 j \sum\Large_{i:i1}^{j} i:i1j(xi) = y
aj
y >=1,且aj >= aj+1。 只有y == 1 j== j+1 时, ∑ i : i 1 j + 1 \sum\Large_{i:i1}^{j+1} i:i1j+1(xi)为1,其它情况下,其和小于1。为1的小数部分用1替换,运算符更少。
五,类似性质四,xi1 +xi2… xim 如果大于等于xin,且i1 i2 …im都小于in,则一定能找到若干项,其和为xin
六,n>0,xn不劣于 x个xn-1
a,表示x,1个x需要0个运算符 x/x + x/x…x/x ,需要2x-1个运算符。
b,n >=2 前者需要 n-1个运算符,后者需要(n-1)*x-1 由于x大于等于2,所以后者大于等于 2n-3 ,由于n>=2,后者大于等于n+2-3=n-1。即后者大于等于前者。
七,xn不劣于xi1 +xi2… xim 。根据性质六,用x个Xn-1代替Xn,会变长或不变。用xn-2代替xn-1 用xn-3代替xn-2 …也是。xn的某个表达式如果有减法,则更长。 加的项的和大于xn,根据性质五六替换后更长。
八,根据性质七,t是xn,最少运算符就是xn。下面讨论 t不是x的幂。令am-1< t < am。则t的表达式不包括am+1及更高次方。y = am+1-t > am+1-am 通过性质四,y必定存在(x-1)个am 。am+1减(x-1)个am ,直接用am代替运算符更少。
九,t的表达式至少一个表达式是加,不可能全部是减,否则其值是负数。

动态规划

动态规划的状态表示

m_mDp[x]表示 x的最少运算符,如果已经计算不重复计算。

动态规划的转移方程

根据性质八和性质九,枚举j,取值范围[0,m]
{ 1 t 等于 1 m − 1 t = a m 见下面的公式 e l s e \begin{cases} 1 & t等于1 \\ m-1 & t = a^m \\ 见下面的公式& else \\ \end{cases} 1m1见下面的公式t等于1t=amelse

m i n { ( a m − t ) / a m − 1 ∗ ( 1 + d p [ a m − 1 ] ) + ( m − 1 ) + d p [ ( a m − t ) m o d a m − 1 ] + 1 , 包括 a m d p [ x j ] + 1 + d p [ t − x n ] 根据性质五,只需要考虑 j = = m − 1 e l s e min\begin{cases} (a^m-t)/a^{m-1}*(1+dp[a^{m-1}])+(m-1)+dp[(a^m-t) \mod a^{m-1}]+1, & 包括a^m \\ dp[x^j]+1+dp[t-x^n] 根据性质五,只需要考虑j == m-1 & else \\ \end{cases} min{(amt)/am1(1+dp[am1])+(m1)+dp[(amt)modam1]+1,dp[xj]+1+dp[txn]根据性质五,只需要考虑j==m1包括amelse
如果 ( a m − t ) m o d a m − 1 (a^m-t) \mod a^{m-1} (amt)modam1 为0要做特殊处理
[ ( a m − t ) m o d a m − 1 [(a^m-t) \mod a^{m-1} [(amt)modam1 a m − 1 a^{m-1} am1 xj t-x^n 全部在[1,t)范围中,所以可以保证收敛性,不断变小。

动态规划的填表顺序

从x向前推。

动态规划的初始值

{ d p [ 1 ] = 1 d p [ 1 < < j ] = j − 1 j 取 [ 0 , m ) \begin{cases} dp[1]= 1 & \\ dp[1 << j] = j-1 & j取[0,m)\\ \end{cases} {dp[1]=1dp[1<<j]=j1j[0,m)

动态规划的返回值

dp[target]

代码

核心代码

class Solution {
public:int leastOpsExpressTarget(int x, int target) {m_x = x;m_mDp[1] = 1;int i = 0;for (long long y = x ; y <= target;y*=x,i++ ){m_mDp[(int)y] = i;}return Rec( target);}int Rec( const int target){assert(target > 0);if (m_mDp.count(target)){return m_mDp[target];}long long y = 1;int m = 0;for (; y <= target; y *= m_x, m++);		const long long llSub = y - target;		const int am1 = (y / m_x);int iRet = Rec(am1) + 1 + Rec(target - am1);assert(am1 < target);const int iCnt = llSub / am1;int iCur = m - 1;if (iCnt > 0 ){iCur += (1 + Rec(am1)) * iCnt;}if (llSub % am1 > 0){iCur += Rec(llSub % am1) + 1;}iRet = min(iRet, iCur);return m_mDp[target]= iRet;}unordered_map<int,int> m_mDp;int m_x;};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{	int x,  target;{Solution sln;x = 3, target = 1;auto res = sln.leastOpsExpressTarget(x, target);Assert(res, 1);}{Solution sln;x = 3, target = 3;auto res = sln.leastOpsExpressTarget(x, target);Assert(res, 0);}{Solution sln;x = 3, target = 9;auto res = sln.leastOpsExpressTarget(x, target);Assert(res, 1);}{Solution sln;x = 3, target = 19;auto res = sln.leastOpsExpressTarget(x, target);Assert(res, 5);}{Solution sln;x = 5, target = 501;auto res = sln.leastOpsExpressTarget(x, target);Assert(res, 8);}{Solution sln;x = 100, target = 100000000;auto res = sln.leastOpsExpressTarget(x, target);Assert(res, 3);}{Solution sln;x = 79, target = 155800339;auto res = sln.leastOpsExpressTarget(x, target);Assert(res, 45);}		}

2023年1月版

class Solution {
public:
int leastOpsExpressTarget(int x, int target) {
if (m_mTargetNum.count(target))
{
return m_mTargetNum[target];
}
if (x == target)
{
return m_mTargetNum[target] = 0;
}
if (x > target)
{
//target个1相加 和 x不断减1
return m_mTargetNum[target] = min(target + target - 1, 1 + (x - target) * 2 - 1);
}
long long llX = x;
int iMulNum = 0;
while (llX < target)
{
iMulNum++;
llX *= x;
}
int iRet = leastOpsExpressTarget(x,target - llX / x) + 1 + iMulNum - 1;
if (llX - target < target)
{
iRet = min(iRet, leastOpsExpressTarget(x, llX - target) + 1 + iMulNum);
}
return m_mTargetNum[target] = iRet;
}
std::unordered_map<int, int> m_mTargetNum;
};

2023年7月版

class Solution {
public:
int leastOpsExpressTarget(const int x, const int target) {
if (0 == target)
{
return 0;
}
if (x == target)
{
return 0;
}
if (mValueToOpeNum.count(target))
{
return mValueToOpeNum[target];
}
if (target < x)
{
return mValueToOpeNum[target] = min(2 * target - 1, 2 * (x - target));
}
long long tmp = 1;
int iMulNum = 0;
while (tmp < target)
{
iMulNum++;
tmp *= x;
};
if (target == tmp)
{
return iMulNum - 1;
}
int iRet = (iMulNum - 1)-1 + 1 + leastOpsExpressTarget(x, target - (tmp / x));
if (tmp - target < target)
{
iRet = min(iRet, (iMulNum-1) + 1 + leastOpsExpressTarget(x, tmp - target));
}
return mValueToOpeNum[target] = iRet;
}
std::unordered_map<int, int> mValueToOpeNum;
};

2023年8月版

class Solution {
public:
int leastOpsExpressTarget(int x, int target) {
while (m_iiMax < target)
{
m_iiMax *= x;
}
return Rec(x, target) - 1;
}
int Rec(int x, int llTarget)
{
if (llTarget > m_iiMax)
{
return 10000;
}
if (0 == llTarget)
{
return 0;
}
if (m_mValueToNum.count(llTarget))
{
return m_mValueToNum[llTarget];
}
int iMulNum = 1;
long long iiMul = x;
while (0 == llTarget % iiMul)
{
iiMul *= x;
iMulNum++;
}
long long llMod = llTarget % iiMul;
const int iOneModNeed = 1 == iMulNum ? 2 : (iMulNum - 1);
const int iModValue = llMod / (iiMul / x);
const int iMay1 = Rec(x, llTarget - llMod) + iOneModNeed * iModValue;
if (llMod == llTarget)
{
const int iMay2 = iMulNum + iOneModNeed * (x - iModValue);
return m_mValueToNum[llTarget] = min(iMay1, iMay2);
}
const int iMay2 = Rec(x, llTarget - llMod + iiMul) + iOneModNeed * (x - iModValue);
return m_mValueToNum[llTarget] = min(iMay1, iMay2);
}
unordered_map<long long, int> m_mValueToNum;
long long m_iiMax=1;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口性能优化常见12式

目录 1.批处理 2.异步处理 3.空间换时间 4.预处理 5.池化思想 6.串行改并行 7.索引 8.避免大事务 9.优化程序结构 10.深分页问题 11.SQL优化 12.锁粒度避免过粗 1.批处理 批量思想&#xff1a;批量操作数据库&#xff0c;这个很好理解&#xff0c;我们在循环插入场…

微服务—Docker

目录 初识Docker Docker与虚拟机的区别 镜像与容器 Docker架构 常见Docker命令 镜像命令 容器命令 数据卷挂载 直接挂载 初识Docker 在项目部署的过程中&#xff0c;如果出现大型项目组件较多&#xff0c;运行环境也较为复杂的情况&#xff0c;部署时会碰到一些问题&…

算法练习-逆波兰表达式求值(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;栈与队列 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c…

Plant, Cell Environment:DNA pull down技术助力揭示AP2/ERF类转录因子提高芍药耐高温能力的分子机制

芍药是一种传统的中药材&#xff0c;并且具有极高的欣赏价值&#xff0c;其生长发育经常受到高温胁迫的影响。褪黑素是一种内源性微分子吲哚胺化合物&#xff0c;在各种生物体中具有多种生理功能&#xff0c;大量研究表明调节与褪黑素生物合成相关的基因来提高植物对高温的耐受…

《区块链简易速速上手小册》第8章:区块链的技术挑战(2024 最新版)

文章目录 8.1 可扩展性问题8.1.1 基础知识8.1.2 主要案例&#xff1a;比特币的可扩展性挑战8.1.3 拓展案例 1&#xff1a;以太坊的可扩展性改进8.1.4 拓展案例 2&#xff1a;侧链和分层解决方案 8.2 安全性与隐私8.2.1 基础知识8.2.2 主要案例&#xff1a;比特币交易的安全性8.…

DVI接口如何连接HDMI接口显示器?DVI转HDMI转换器DHA

DVI转HDMI转换器DHA简介 DVI转HDMI转换器DHA能够将DVI信号和R/L音频信号输入转换成HDMI信号输出,独特的功能使其顺畅地整合到家庭影院中&#xff0c;并且播放出高品质的图像。主要用于数据监控中心、大型会议展示中心、学校及各个公司 DVI转HDMI转换器DHA特点 01.支持分辨率4K…

网络协议 TCP协议

网络协议 TCP协议 文章目录 网络协议 TCP协议1. TCP协议段格式2. 可靠传输保障机制2.1 确认应答2.2 超时重传 3. 连接保障机制3.1 三次握手&#xff08;建立连接&#xff09;3.2 四次挥手&#xff08;断开连接&#xff09;3.3 TCP状态转换过程 4. 传输效率保障机制4.1 滑动窗口…

MySQL原理(二)存储引擎(1)概述

一、存储引擎介绍 1、概念&#xff1a; &#xff08;1&#xff09;MySQL中的数据用各种不下同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力&#xff0c;这些不同的技术以及配套的功能在MySQL中称为存储引擎…

【全csdn最前沿LVGL9】按钮的使用(lv_button)、标签的使用(lv_label)

文章目录 前言一、按钮概述二、按钮的使用2.1 创建一个按钮2.2 按钮的样式 三、标签概述四、标签的使用4.1 创建一个标签4.2 样式4.3 设置文本4.4 长文本模式4.5 文本选择4.6 文本对齐4.7 非常长的文本4.8 字体设置字体支持的Unicode字符字体列表特殊的字体 总结 前言 欢迎来到…

Unity使用反向遮罩实现镂空shader

实现步骤&#xff1a; 1&#xff0c;创建两个材质球&#xff0c;遮罩层的属性如下&#xff1a; 被遮罩层的属性如下&#xff1a; 2&#xff0c;使用两张image&#xff0c;遮罩层在父节点&#xff0c;被遮罩层在子节点&#xff0c;然后分别添加材质球与镂空图片 实现效果如下&a…

k8s存储之PV、PVC

在k8s集群中&#xff0c;资源存储会散落到各个工作节点上&#xff0c;这样对用资源调用很不方便&#xff0c;那么k8s是如何实现存储资源共享的呢&#xff0c;本文浅尝辄止的探讨一下&#xff0c;k8s是通过pv、pvc实现的。 一、PV、PVC的概念 1、持久卷(PV&#xff09; pv是Pe…

2024-01-07-AI 大模型全栈工程师 - AI 产品部署和交付

摘要 2024-01-07 周日 杭州 阴 本节内容: 如何选择 GPU 和云服务器&#xff0c;追求最高性价比如何部署自己的 fine-tune 的模型&#xff0c;向业务提供高可用服务如何控制内容安全&#xff0c;做好算法备案&#xff0c;确保合规 课程内容 1. 硬件选型 a. Nvidia 几乎是模…

IAR编译和调试CMS32L051

0 Preface/Foreword 0.1 参考文档 中微半导体BAT系列单片机学习笔记_V1.1.pdf 1 配置方法 1.1 编译工具链添加 CMS对于IAR工具&#xff0c;有一个插件文件&#xff0c;用于安装对应的CMS系列芯片。 工具名称&#xff1a;iar_plug20210926.7z 按照完成之后&#xff0c;可…

如果我要访问一个网址,那么在网络中会有哪些过程

访问一个网址是我们日常网络使用中非常常见的操作&#xff0c;背后涉及到一系列精密而复杂的步骤。这个过程包括DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求、服务器响应、浏览器渲染等环节。在这篇文章中&#xff0c;我们将深入探讨这些步骤&#xff0c;并解释它们在…

强大的虚拟机Parallels Desktop 19 mac中文激活

Parallels Desktop是一款功能全面、易于使用的虚拟机软件&#xff0c;它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载&#xff1a;Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力&#xff0c;让用户能够迅…

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

Wampserver 切换中文时无法启动报错处理

在使用 Wampserver 软件时默认为英语&#xff0c;可以看到有语言选择功能&#xff0c;切换其他语言。但选择中文切换后&#xff0c;软件重启时报如下错误&#xff1a; The configuration file contains a systax error on line 44:[EParseError] Mismatched or misplaced quoue…

(十六)串口UART

文章目录 UART简介传输数据帧和波特率定时器1作为串口1波特率发生器串口部分相关寄存器TMODAUXRPCONSCONSBUF 串口1工作模式1&#xff1a;8位UART&#xff0c;波特率可变总体工作原理如何简单接收一个字符和发送数据一步之遥的设置现象演示 UART简介 通用异步收发传输器(Unive…

一种轻量分表方案-MyBatis拦截器分表实践|京东零售技术实践

背景 部门内有一些亿级别核心业务表增速非常快&#xff0c;增量日均100W&#xff0c;但线上业务只依赖近一周的数据。随着数据量的迅速增长&#xff0c;慢SQL频发&#xff0c;数据库性能下降&#xff0c;系统稳定性受到严重影响。本篇文章&#xff0c;将分享如何使用MyBatis拦…

微软Azure-OpenAI 测试调用及说明

本文是公司在调研如何集成Azure-openAI时&#xff0c;调试测试用例得出的原文&#xff0c;原文主要基于官方说明文档简要整理实现 本文已假定阅读者申请部署了模型&#xff0c;已获取到所需的密钥和终结点 变量名称值ENDPOINT从 Azure 门户检查资源时&#xff0c;可在“密钥和…