[動態規劃及遞歸記憶搜索法]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.pswp.cn/news/207637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207637.shtml
英文地址,請注明出處:http://en.pswp.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…