女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

經(jīng)典動(dòng)態(tài)規(guī)劃:戳氣球問題

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:算法與數(shù)據(jù)結(jié)構(gòu) ? 2020-06-03 17:29 ? 次閱讀

今天我們要聊的這道題「Burst Balloon」和之前我們寫過的那篇 經(jīng)典動(dòng)態(tài)規(guī)劃:高樓扔雞蛋問題 分析過的高樓扔雞蛋問題類似,知名度很高,但難度確實(shí)也很大。因此 labuladong 公眾號(hào)就給這道題賜個(gè)座,來看一看這道題目到底有多難。

它是 LeetCode 第 312 題,題目如下:

title

首先必須要說明,這個(gè)題目的狀態(tài)轉(zhuǎn)移方程真的比較巧妙,所以說如果你看了題目之后完全沒有思路恰恰是正常的。雖然最優(yōu)答案不容易想出來,但基本的思路分析是我們應(yīng)該力求做到的。所以本文會(huì)先分析一下常規(guī)思路,然后再引入動(dòng)態(tài)規(guī)劃解法。

一、回溯思路

先來順一下解決這種問題的套路:

我們前文多次強(qiáng)調(diào)過,很顯然只要涉及求最值,沒有任何奇技淫巧,一定是窮舉所有可能的結(jié)果,然后對(duì)比得出最值。

所以說,只要遇到求最值的算法問題,首先要思考的就是:如何窮舉出所有可能的結(jié)果?

窮舉主要有兩種算法,就是回溯算法和動(dòng)態(tài)規(guī)劃,前者就是暴力窮舉,而后者是根據(jù)狀態(tài)轉(zhuǎn)移方程推導(dǎo)「狀態(tài)」。

如何將我們的扎氣球問題轉(zhuǎn)化成回溯算法呢?這個(gè)應(yīng)該不難想到的,我們其實(shí)就是想窮舉戳氣球的順序,不同的戳氣球順序可能得到不同的分?jǐn)?shù),我們需要把所有可能的分?jǐn)?shù)中最高的那個(gè)找出來,對(duì)吧。

那么,這不就是一個(gè)「全排列」問題嘛,我們前文 回溯算法框架套路詳解 中有全排列算法的詳解和代碼,其實(shí)只要稍微改一下邏輯即可,偽碼思路如下:

intres=Integer.MIN_VALUE; /*輸入一組氣球,返回戳破它們獲得的最大分?jǐn)?shù)*/ intmaxCoins(int[]nums){ backtrack(nums,0); returnres; } /*回溯算法的偽碼解法*/ voidbacktrack(int[]nums,intsocre){ if(nums為空){ res=max(res,score); return; } for(inti=0;i

回溯算法就是這么簡單粗暴,但是相應(yīng)的,算法的效率非常低。這個(gè)解法等同于全排列,所以時(shí)間復(fù)雜度是階乘級(jí)別,非常高,題目說了nums的大小n最多為 500,所以回溯算法肯定是不能通過所有測(cè)試用例的。

二、動(dòng)態(tài)規(guī)劃思路

這個(gè)動(dòng)態(tài)規(guī)劃問題和我們之前的動(dòng)態(tài)規(guī)劃系列文章相比有什么特別之處?為什么它比較難呢?

原因在于,這個(gè)問題中我們每戳破一個(gè)氣球nums[i],得到的分?jǐn)?shù)和該氣球相鄰的氣球nums[i-1]和nums[i+1]是有相關(guān)性的。

我們前文動(dòng)態(tài)規(guī)劃套路框架詳解 說過運(yùn)用動(dòng)態(tài)規(guī)劃算法的一個(gè)重要條件:子問題必須獨(dú)立。所以對(duì)于這個(gè)戳氣球問題,如果想用動(dòng)態(tài)規(guī)劃,必須巧妙地定義dp數(shù)組的含義,避免子問題產(chǎn)生相關(guān)性,才能推出合理的狀態(tài)轉(zhuǎn)移方程。

如何定義dp數(shù)組呢,這里需要對(duì)問題進(jìn)行一個(gè)簡單地轉(zhuǎn)化。題目說可以認(rèn)為nums[-1] = nums[n] = 1,那么我們先直接把這兩個(gè)邊界加進(jìn)去,形成一個(gè)新的數(shù)組points:

intmaxCoins(int[]nums){ intn=nums.length; //兩端加入兩個(gè)虛擬氣球 int[]points=newint[n+2]; points[0]=points[n+1]=1; for(inti=1;i<=?n;?i++)?{ ????????points[i]?=?nums[i?-?1]; ????} ????//?... }

現(xiàn)在氣球的索引變成了從1到n,points[0]和points[n+1]可以認(rèn)為是兩個(gè)「虛擬氣球」。

那么我們可以改變問題:在一排氣球points中,請(qǐng)你戳破氣球0和氣球n+1之間的所有氣球(不包括0和n+1),使得最終只剩下氣球0和氣球n+1兩個(gè)氣球,最多能夠得到多少分?

現(xiàn)在可以定義dp數(shù)組的含義:

dp[i][j] = x表示,戳破氣球i和氣球j之間(開區(qū)間,不包括i和j)的所有氣球,可以獲得的最高分?jǐn)?shù)為x。

那么根據(jù)這個(gè)定義,題目要求的結(jié)果就是dp[0][n+1]的值,而 base case 就是dp[i][j] = 0,其中0 <= i <= n+1, j <= i+1,因?yàn)檫@種情況下,開區(qū)間(i, j)中間根本沒有氣球可以戳。

//basecase已經(jīng)都被初始化為0 int[][]dp=newint[n+2][n+2];

現(xiàn)在我們要根據(jù)這個(gè)dp數(shù)組來推導(dǎo)狀態(tài)轉(zhuǎn)移方程了,根據(jù)我們前文的套路,所謂的推導(dǎo)「狀態(tài)轉(zhuǎn)移方程」,實(shí)際上就是在思考怎么「做選擇」,也就是這道題目最有技巧的部分:

不就是想求戳破氣球i和氣球j之間的最高分?jǐn)?shù)嗎,如果「正向思考」,就只能寫出前文的回溯算法;我們需要「反向思考」,想一想氣球i和氣球j之間最后一個(gè)被戳破的氣球可能是哪一個(gè)?

其實(shí)氣球i和氣球j之間的所有氣球都可能是最后被戳破的那一個(gè),不防假設(shè)為k。回顧動(dòng)態(tài)規(guī)劃的套路,這里其實(shí)已經(jīng)找到了「狀態(tài)」和「選擇」:i和j就是兩個(gè)「狀態(tài)」,最后戳破的那個(gè)氣球k就是「選擇」。

根據(jù)剛才對(duì)dp數(shù)組的定義,如果最后一個(gè)戳破氣球k,dp[i][j]的值應(yīng)該為:

dp[i][j]=dp[i][k]+dp[k][j] +points[i]*points[k]*points[j]

你不是要最后戳破氣球k嗎?那得先把開區(qū)間(i, k)的氣球都戳破,再把開區(qū)間(k, j)的氣球都戳破;最后剩下的氣球k,相鄰的就是氣球i和氣球j,這時(shí)候戳破k的話得到的分?jǐn)?shù)就是points[i]*points[k]*points[j]。

那么戳破開區(qū)間(i, k)和開區(qū)間(k, j)的氣球最多能得到的分?jǐn)?shù)是多少呢?嘿嘿,就是dp[i][k]和dp[k][j],這恰好就是我們對(duì)dp數(shù)組的定義嘛!

結(jié)合這個(gè)圖,就能體會(huì)出dp數(shù)組定義的巧妙了。由于是開區(qū)間,dp[i][k]和dp[k][j]不會(huì)影響氣球k;而戳破氣球k時(shí),旁邊相鄰的就是氣球i和氣球j了,最后還會(huì)剩下氣球i和氣球j,這也恰好滿足了dp數(shù)組開區(qū)間的定義。

那么,對(duì)于一組給定的i和j,我們只要窮舉i < k < j的所有氣球k,選擇得分最高的作為dp[i][j]的值即可,這也就是狀態(tài)轉(zhuǎn)移方程:

//最后戳破的氣球是哪個(gè)? for(intk=i+1;k

寫出狀態(tài)轉(zhuǎn)移方程就完成這道題的一大半了,但是還有問題:對(duì)于k的窮舉僅僅是在做「選擇」,但是應(yīng)該如何窮舉「狀態(tài)」i和j呢?

for(inti=...;;) for(intj=...;;) for(intk=i+1;k

三、寫出代碼

關(guān)于「狀態(tài)」的窮舉,最重要的一點(diǎn)就是:狀態(tài)轉(zhuǎn)移所依賴的狀態(tài)必須被提前計(jì)算出來。

拿這道題舉例,dp[i][j]所依賴的狀態(tài)是dp[i][k]和dp[k][j],那么我們必須保證:在計(jì)算dp[i][j]時(shí),dp[i][k]和dp[k][j]已經(jīng)被計(jì)算出來了(其中i < k < j)。

那么應(yīng)該如何安排i和j的遍歷順序,來提供上述的保證呢?我們前文 動(dòng)態(tài)規(guī)劃答疑篇 寫過處理這種問題的一個(gè)雞賊技巧:根據(jù) base case 和最終狀態(tài)進(jìn)行推導(dǎo)。

PS:最終狀態(tài)就是指題目要求的結(jié)果,對(duì)于這道題目也就是dp[0][n+1]。

我們先把 base case 和最終的狀態(tài)在 DP table 上畫出來:

對(duì)于任一dp[i][j],我們希望所有dp[i][k]和dp[k][j]已經(jīng)被計(jì)算,畫在圖上就是這種情況:

那么,為了達(dá)到這個(gè)要求,可以有兩種遍歷方法,要么斜著遍歷,要么從下到上從左到右遍歷:

斜著遍歷有一點(diǎn)難寫,所以一般我們就從下往上遍歷,下面看完整代碼:

intmaxCoins(int[]nums){ intn=nums.length; //添加兩側(cè)的虛擬氣球 int[]points=newint[n+2]; points[0]=points[n+1]=1; for(inti=1;i<=?n;?i++)?{ ????????points[i]?=?nums[i?-?1]; ????} ????//?base?case?已經(jīng)都被初始化為?0 ????int[][]?dp?=?new?int[n?+?2][n?+?2]; ????//?開始狀態(tài)轉(zhuǎn)移 ????//?i?應(yīng)該從下往上 ????for?(int?i?=?n;?i?>=0;i--){ //j應(yīng)該從左往右 for(intj=i+1;j

至此,這道題目就完全解決了,十分巧妙,但也不是那么難,對(duì)吧?

關(guān)鍵在于dp數(shù)組的定義,需要避免子問題互相影響,所以我們反向思考,將dp[i][j]的定義設(shè)為開區(qū)間,考慮最后戳破的氣球是哪一個(gè),以此構(gòu)建了狀態(tài)轉(zhuǎn)移方程。

對(duì)于如何窮舉「狀態(tài)」,我們使用了小技巧,通過 base case 和最終狀態(tài)推導(dǎo)出i,j的遍歷方向,保證正確的狀態(tài)轉(zhuǎn)移。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4699

    瀏覽量

    94758
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4887

    瀏覽量

    70264

原文標(biāo)題:經(jīng)典動(dòng)態(tài)規(guī)劃:戳氣球問題

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    AGV通信第2期 AGV集群智能路徑規(guī)劃解決方案

    在智能制造加速發(fā)展的背景下,AGV作為智慧物流的核心載體,其路徑規(guī)劃的智能化水平直接影響工廠的運(yùn)作效率。在工廠物流升級(jí)過程中,企業(yè)面臨以下技術(shù)挑戰(zhàn): ? 動(dòng)態(tài)環(huán)境適應(yīng):復(fù)雜工況下需實(shí)時(shí)避障并保持最優(yōu)
    的頭像 發(fā)表于 05-09 14:03 ?159次閱讀
    AGV通信第2期 AGV集群智能路徑<b class='flag-5'>規(guī)劃</b>解決方案

    CADENAS 數(shù)字產(chǎn)品配置器輕松實(shí)現(xiàn)Ascendor電梯規(guī)劃

    。2022 年,Ascendor 啟動(dòng)了一項(xiàng)數(shù)字化推進(jìn)計(jì)劃,其中一個(gè)重要部分就是實(shí)施由 CADENAS 提供技術(shù)支持的數(shù)字化產(chǎn)品配置器。 利用高質(zhì)量的規(guī)劃數(shù)據(jù)進(jìn)行靈活的電梯規(guī)劃 數(shù)字產(chǎn)品配置器提供
    發(fā)表于 04-28 14:22

    多種經(jīng)典電路合集

    N多的經(jīng)典電路,看看肯定有幫助!純分享貼,有需要可以直接下載附件獲取文檔! (如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持一下哦~)
    發(fā)表于 04-24 16:53

    經(jīng)典CH340G驅(qū)動(dòng)

    經(jīng)典CH340G驅(qū)動(dòng)
    發(fā)表于 04-09 16:04 ?0次下載

    低功耗藍(lán)牙和經(jīng)典藍(lán)牙,到底怎么選?

    經(jīng)典藍(lán)牙(Bluetooth Classic)和低功耗藍(lán)牙(Bluetooth Low Energy),兩者有什么區(qū)別?為什么他們都叫“藍(lán)牙”?Bluetooth Low Energy
    的頭像 發(fā)表于 04-07 16:01 ?456次閱讀
    低功耗藍(lán)牙和<b class='flag-5'>經(jīng)典</b>藍(lán)牙,到底怎么選?

    具身智能工業(yè)機(jī)器人路徑規(guī)劃算法成為破局關(guān)鍵

    在工業(yè)4.0與智能制造深度融合的今天,傳統(tǒng)路徑規(guī)劃算法已難以滿足動(dòng)態(tài)生產(chǎn)環(huán)境的需求。面對(duì)復(fù)雜場(chǎng)景下的高精度避障、實(shí)時(shí)決策與多任務(wù)協(xié)同挑戰(zhàn),具身智能工業(yè)機(jī)器人路徑規(guī)劃算法成為破局關(guān)鍵。作為具身智能領(lǐng)域
    的頭像 發(fā)表于 03-28 15:01 ?279次閱讀

    LLC動(dòng)態(tài)性能分析

    這里的LLC動(dòng)態(tài)是指LLC電路在突加負(fù)載時(shí)的動(dòng)態(tài)響應(yīng)。一般用輸出電壓的下跌和過沖評(píng)判LLC動(dòng)態(tài)性能。
    的頭像 發(fā)表于 03-19 09:45 ?812次閱讀
    LLC<b class='flag-5'>動(dòng)態(tài)</b>性能分析

    用MSN4688驅(qū)動(dòng)IGBT的經(jīng)典的電路

    用MSN4688驅(qū)動(dòng)IGBT的經(jīng)典的電路
    發(fā)表于 02-07 14:13 ?2次下載

    99%的人都不知道,氣密性測(cè)試儀器竟如此簡單!

    大上,但氣密性測(cè)試儀器的原理其實(shí)非常簡單,甚至比你想象的要容易理解得多。想象一下,給氣球充氣:當(dāng)你往氣球里吹氣時(shí),氣球會(huì)逐漸膨脹。如果你捏住氣球的吹氣口,
    的頭像 發(fā)表于 02-06 14:19 ?511次閱讀
    99%的人都不知道,氣密性測(cè)試儀器竟如此簡單!

    運(yùn)算放大器經(jīng)典應(yīng)用

    運(yùn)算放大器經(jīng)典應(yīng)用
    發(fā)表于 01-26 14:23

    Java中時(shí)間的使用

    Java中時(shí)間的使用
    的頭像 發(fā)表于 11-06 16:04 ?464次閱讀
    Java中時(shí)間<b class='flag-5'>戳</b>的使用

    多臺(tái)倉儲(chǔ)AGV協(xié)作全局路徑規(guī)劃算法的研究

    多AGV動(dòng)態(tài)路徑規(guī)劃需解決沖突避免,核心在整體協(xié)調(diào)最優(yōu)。規(guī)劃時(shí)考慮道路設(shè)計(jì)、擁堵、最短路徑和交通管制,用A*算法避免重復(fù)路徑和轉(zhuǎn)彎,同時(shí)需交通管制防相撞。創(chuàng)新響應(yīng)需求是關(guān)鍵,良好路徑規(guī)劃
    的頭像 發(fā)表于 10-28 17:38 ?725次閱讀
    多臺(tái)倉儲(chǔ)AGV協(xié)作全局路徑<b class='flag-5'>規(guī)劃</b>算法的研究

    同星多設(shè)備間的時(shí)間同步機(jī)制TSync功能與使用

    隨著汽車網(wǎng)絡(luò)測(cè)試的通道數(shù)量不斷增加,時(shí)常需要多個(gè)同星設(shè)備同時(shí)連接在同一臺(tái)電腦的同一個(gè)TSMaster應(yīng)用程序,并進(jìn)行多設(shè)備同時(shí)執(zhí)行CAN報(bào)文收發(fā)和記錄等功能,必然有多設(shè)備之間的時(shí)間同步以及設(shè)備
    的頭像 發(fā)表于 10-12 08:05 ?3279次閱讀
    同星多設(shè)備間的時(shí)間<b class='flag-5'>戳</b>同步機(jī)制TSync功能與使用

    物聯(lián)網(wǎng)中的普通傳感器如何通過DTU/RTU透?jìng)鲙в袝r(shí)間和IMEI的數(shù)據(jù)

    一 概述 時(shí)間是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)。時(shí)間是使用數(shù)字簽名技術(shù)產(chǎn)生的數(shù)據(jù),簽名的對(duì)象包括了原始
    的頭像 發(fā)表于 09-25 16:35 ?1738次閱讀
    物聯(lián)網(wǎng)中的普通傳感器如何通過DTU/RTU透?jìng)鲙в袝r(shí)間<b class='flag-5'>戳</b>和IMEI的數(shù)據(jù)

    esp32獲取時(shí)間的相關(guān)函數(shù)是哪個(gè)?

    esp32 獲取時(shí)間的相關(guān)函數(shù)是哪個(gè),我用了sntp_get_current_timestamp這個(gè)函數(shù),編譯的時(shí)候說找不到,有沒有相關(guān)的例程參考?
    發(fā)表于 06-11 07:26