[动态规划及递归记忆搜索法]2.插入乘号

插入乘号

题目描述

给定一个非负整数,用k个乘号将其分割,使得乘积最大。
例如:在整数12345中插入两个乘号,有以下插入法:
1*2*345 1*23*45 1*234*5
12*3*45 12*34*5
123*4*5
其中最大值是123*4*5 = 2460

关于输入

一行两个非负整数,非负整数s(s ≦ 10^9)和乘号的个数k(0 ≦ k < s的位数)。
输入保证,如果按题目要求的乘法操作,不会使int发生溢出。

关于输出

一行一个整数,即乘积的最大值

例子输入
12345 2
例子输出
2460
解题分析

动态规划能够解决的问题,一般可看出解决此问题需要解决的子问题,本题中,题目给出了两个信息,一个是一个非负整数,另一个是插入的乘号的数量,我们需要想想,本题的dp数组应该如何去定义?一维还是二维?这取决于,我们能用几个状态来描述清楚问题。

再来复习一下动态规划的基本思路:

动态规划(Dynamic Programming,简称 DP)是一种解决复杂问题的策略,主要用于优化问题,如求最大值、最小值或者计数问题等。下面是动态规划的基本思路和解决策略:

1. **确定状态**:在动态规划中,状态通常表示为一个或多个变量的组合,这些变量能够完全描述一个问题。例如,在背包问题中,状态可能是当前的重量和价值。

2. **确定状态转移方程**:状态转移方程是描述如何从一个状态到另一个状态的规则。在大多数情况下,这个规则是基于问题的特性和逻辑来确定的。例如,在最长公共子序列问题中,如果两个字符相等,那么最长公共子序列的长度就是前一个状态的长度加一;否则,最长公共子序列的长度就是前两个状态中较大的那个。

3. **确定边界条件**:边界条件描述了当问题降到最小规模时的解。例如,在斐波那契数列问题中,边界条件是第一项和第二项分别为1。

4. **计算并存储状态**:在动态规划中,一般会使用一个表格(一维、二维或者更高维度)来存储所有的状态。计算顺序通常是从边界条件开始,根据状态转移方程逐步计算出所有的状态。

5. **根据存储的状态得到最终结果**:在计算出所有的状态后,可以根据题目要求从存储的状态中得到最终的结果。

动态规划的关键是理解状态和状态转移方程的概念。一旦理解了这两个概念,就可以应用动态规划来解决各种各样的问题。在实际应用中,可能需要花费一些时间和思考来确定正确的状态和状态转移方程。

对于我们现在面临的问题,可以发现的,我们这样去定义dp数组,用两个变量来描述清楚问题,dp[i][j],其中,i表示我们想要处理的数字的前i位,而j表示我们想要插入的乘号的数量。

转移方程呢?怎么去书写?

首先我们需要一个函数去帮助我们去对输入的整数进行分割,sub(i,j)表示从i位置到j位置的切割数字。

接下里,我们可以把问题化小,对于dp[i][j]即在前i个字符内插入j个乘号,问题等价于,我们从k=j位置开始(因为要插入j-1个乘号),在前k个位置先插入j-1个乘号,再把最后一个乘号放在第k个位置,然后不断增加k直至k到i-1位置,所以,我们有,dp[i][j]=max(dp[j][j-1]*sub(j,i-1),dp[j+1][j-1]*sub(j+1,i-1).....dp[i-1][j-1]*sub(i-1,i-1)),这个过程可以通过循环实现。

dp代码实现如下
#include <iostream>
#include <cstring>
using namespace std;char num[10];
int k;
int dp[10][10]={0};int sub(int i,int j){int ans=0;while(i<=j){ans=ans*10+num[i]-'0';i++;}return ans;
}int main() {cin>>num>>k;int len=strlen(num);for(int i=1;i<=len;i++){for(int j=0;j<=i-1 && j<=k;j++){if(j==0){dp[i][j]=sub(0,i-1);}else{for(int k=j;k<=i-1;k++){dp[i][j]=max(dp[i][j],dp[k][j-1]*sub(k,i-1));}}}}cout<<dp[len][k]<<endl;return 0;
}
记忆搜索法结合递归代码实现如下

我们定义f(i,j)为在前i个位置插入j个乘号得到的最大值。

#include <iostream>
#include <cstring>
using namespace std;char num[10];
int dp[10][10]={0};int sub(int i,int j){int ans=0;while(i<=j){ans=ans*10+num[i]-'0';i++;}return ans;
}int f(int i,int j){if(dp[i][j]){return dp[i][j];}if(j==0){return dp[i][j]=sub(0,i-1);}for(int k=j;k<=i-1;k++){dp[i][j]=max(dp[i][j],f(k,j-1)*sub(k,i-1));}return dp[i][j];
}int main() {int k;cin>>num>>k;int len=strlen(num);cout<<f(len,k)<<endl;return 0;
}

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

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

相关文章

前端小技巧: 面向切面编程在前端代码中的应用

面向切面编程 面向切面编程在java中提出这类概念但是在js没有束缚和约定&#xff0c;只需要按编程思想来实现原理在js中使用function或class实现面向切面编程 面向切面概念 AOP (Aspect Oriented Programming) 面向切面编程主要实现目的是针对业务处理过程中的切面进行提取&…

第18章:随堂复习与企业真题(JDK8-17新特性)

第18章&#xff1a;随堂复习与企业真题&#xff08;JDK8-17新特性&#xff09; 一、随堂复习 1. JDK新特性的概述 几个重要的版本 jdk 5.0 / jdk 8.0 &#xff1a;里程碑式的版本jdk9.0 开始每6个月发布一个新的版本LTS : jdk8 、 jdk 11 、 jdk 17 如何学习新特性 > 角…

Android安全学习路标

1. Android操作系统基础知识 首先&#xff0c;你需要建立坚实的Android操作系统基础知识&#xff0c;包括Android架构、进程和内存管理、应用组件和权限模型等基本概念。 2. 安全防范理论 学习关于安全防范理论的基础知识&#xff0c;包括常见的威胁模型、攻击类型和安全风险…

Python-猜数字游戏

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

免费的AI改写文案软件,热门AI改写文案软件【2024】

在数字化时代&#xff0c;文案创作变得更为便捷&#xff0c;其中AI改写文案软件的兴起为写作者们带来了全新的创作体验。这些工具通过智能算法和自然语言处理技术&#xff0c;能够快速改写文本&#xff0c;提高创作效率。本文将深入探讨AI改写文案软件的现状&#xff0c;介绍一…

LeetCode题:174. 地下城游戏

目录 一、题目要求 二、解题思路 &#xff08;1&#xff09;状态表示 &#xff08;2&#xff09;状态转移方程 &#xff08;3&#xff09;初始化dp表 &#xff08;4&#xff09;填表顺序 &#xff08;5&#xff09;返回值 三、代码 一、题目要求 174. 地下城游戏 恶魔们…

swagger入门

swagger入门 pom依赖 不用专门导入swagger 因为springboot已经将它集成了 org.springframework.boot spring-boot-starter com.github.xiaoymin knife4j-spring-boot-starter Swagger配置类 Configuration public class SwaggerConfig { // 创建并配置Docket Bean&#xf…

snakeyaml编辑yaml文件并覆盖注释

文章目录 前言技术积累实战演示1、引入maven依赖2、覆盖注释工具类3、snakeyaml工具类4、测试用例5、测试效果展示 写在最后 前言 最近在做一个动态整合框架的项目&#xff0c;需要根据需求动态组装各个功能模块。其中就涉及到了在application.yaml中加入其他模块的配置&#…

TCP传输层详解(计算机网络复习)

介绍&#xff1a;TCP/IP包含了一系列的协议&#xff0c;也叫TCP/IP协议族&#xff0c;简称TCP/IP。该协议族提供了点对点的连接机制&#xff0c;并将传输数据帧的封装、寻址、传输、路由以及接收方式都予以标准化 TCP/IP的分层模型 在讲TCP/IP协议之前&#xff0c;首先介绍一…

力扣贪心题解 跳跃游戏

55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b…

信息系统开发方法

企业信息系统对于企业信息化的重要意义是不言而喻的。从实际运行的效果来看&#xff0c;有些信息系统运行得很成功&#xff0c;取得了巨大的经济效益和社会效益&#xff1b;但也有些信息系统效果并不显著&#xff0c;甚至还有个别信息系统开始时还能正常运行&#xff0c;可时间…

广州数字孪生赋能工业制造,加速推进制造业数字化转型

广州数字孪生赋能工业制造&#xff0c;加速推进制造业数字化转型。数字孪生系统基于历史数据、实时数据&#xff0c;采用人工智能、大数据分析等新一代信息技术对物理实体的组成、特征、功能和性能进行数字化定义和建模。通过构建在信息世界对物理实体的等价映射&#xff0c;对…

Axure官方软件安装、汉化保姆级教程(带官方资源下载)

1.下载汉化包 百度云链接&#xff1a;https://pan.baidu.com/s/1lluobjjBZvitASMt8e0A_w?pwdjqxn 提取码&#xff1a; jqxn 2.解压压缩包 3.安装Axure 进行安装 点击next 打勾&#xff0c;然后next, 默认是c盘&#xff0c;修改成自己的文件夹&#xff08;不要什么都放c盘里…

RestTemplate硬编码的使用

RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式&#xff0c;统一了RESTFul的标准&#xff0c;封装了http连接&#xff0c;我们只需要传入url及其返回值类型即可。相较于之前常用的HttpClient&#xff0c;RestTemplate是一种更…

API测试基础之http协议

http简介&#xff1a; http&#xff08;超文本传输协议&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP&#xff08;传输控制协议&#xff09;之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出…

远程控制如何赋能智能制造?贝锐向日葵制造业场景案例解析

随着数字化转型在制造业的不断深入&#xff0c;企业在产线端也逐渐投入更多智能化设备&#xff0c;数字化、智能化设备其中一个比较显著的优势就是可以依托互联网实现远程运维和调试&#xff0c;大大提升产线设备的稳定性和工作效率&#xff1b;而远程调试运维一个重要的实现方…

人工智能原理复习--搜索策略(一)

文章目录 上一篇搜索概述一般图搜索盲目搜索下一篇 上一篇 人工智能原理复习–确定性推理 搜索概述 问题求解分为两大类&#xff1a;知识贫乏系统&#xff08;依靠搜索技术解决&#xff09;、知识丰富系统&#xff08;依靠推理技术&#xff09; 两大类搜索技术&#xff1a; …

海思3516DV500下的目标识别算法运行评估,包含yolov7,yolov8

目前在3516DV500下&#xff0c;自己训练的模型的评估实测结果。根据实际模型会有些许差异。 涉及到技术细节的部分因为商业用途&#xff0c;有部分省略。如需相关技术服务项目合作可私信联系。 我司推出的目标识别跟踪模块&#xff0c;支持热红外、可见光主流多光谱视频输入与目…

WeiPHP 微信开发平台 SQL注入漏洞复现

0x01 产品简介 weiphp 是一个开源,高效,简洁的微信开发平台,基于 oneThink 内容管理框架实现。 0x02 漏洞概述 weiphp 微信开发平台 _send_by_group、 wp_where、 get_package_template等接口处存在 SQL 注入漏洞,攻击者利用此漏洞可获取数据库中的信息(例如,管理员后台…

三数组最小距离:2020年408算法题

算法思想 算法实现 #define INT_MAX 0x7fffffff //c语言int类型最大值 //计算绝对值 int abs(int a){if(a<0) return -a;else return a; } //判断a是否为3个数中最小值 bool isMin(int a,int b,int c){if(a<b&&a<c) return true;return false; }//主函数 in…