女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

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

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

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

動(dòng)態(tài)規(guī)劃詳細(xì)指南(下)

jf_78858299 ? 來源:labuladong ? 作者:labuladong ? 2023-04-19 10:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

二、湊零錢問題

先看下題目:給你k種面值的硬幣,面值分別為c1, c2 ... ck,每種硬幣的數(shù)量無限,再給一個(gè)總金額amount,問你最少需要幾枚硬幣湊出這個(gè)金額,如果不可能湊出,算法返回 -1 。算法的函數(shù)簽名如下:

// coins 中是可選硬幣面值,amount 是目標(biāo)金額
int coinChange(int[] coins, int amount);

比如說k = 3,面值分別為 1,2,5,總金額amount = 11。那么最少需要 3 枚硬幣湊出,即 11 = 5 + 5 + 1。

你認(rèn)為計(jì)算機(jī)應(yīng)該如何解決這個(gè)問題?顯然,就是把所有肯能的湊硬幣方法都窮舉出來,然后找找看最少需要多少枚硬幣。

1、暴力遞歸

首先,這個(gè)問題是動(dòng)態(tài)規(guī)劃問題,因?yàn)樗哂小缸顑?yōu)子結(jié)構(gòu)」。 要符合「最優(yōu)子結(jié)構(gòu)」,子問題間必須互相獨(dú)立 。啥叫相互獨(dú)立?你肯定不想看數(shù)學(xué)證明,我用一個(gè)直觀的例子來講解。

比如說,你的原問題是考出最高的總成績(jī),那么你的子問題就是要把語文考到最高,數(shù)學(xué)考到最高…… 為了每門課考到最高,你要把每門課相應(yīng)的選擇題分?jǐn)?shù)拿到最高,填空題分?jǐn)?shù)拿到最高…… 當(dāng)然,最終就是你每門課都是滿分,這就是最高的總成績(jī)。

得到了正確的結(jié)果:最高的總成績(jī)就是總分。因?yàn)檫@個(gè)過程符合最優(yōu)子結(jié)構(gòu),“每門科目考到最高”這些子問題是互相獨(dú)立,互不干擾的。

但是,如果加一個(gè)條件:你的語文成績(jī)和數(shù)學(xué)成績(jī)會(huì)互相制約,此消彼長(zhǎng)。這樣的話,顯然你能考到的最高總成績(jī)就達(dá)不到總分了,按剛才那個(gè)思路就會(huì)得到錯(cuò)誤的結(jié)果。因?yàn)樽訂栴}并不獨(dú)立,語文數(shù)學(xué)成績(jī)無法同時(shí)最優(yōu),所以最優(yōu)子結(jié)構(gòu)被破壞。

回到湊零錢問題,為什么說它符合最優(yōu)子結(jié)構(gòu)呢?比如你想求amount = 11時(shí)的最少硬幣數(shù)(原問題),如果你知道湊出amount = 10的最少硬幣數(shù)(子問題),你只需要把子問題的答案加一(再選一枚面值為 1 的硬幣)就是原問題的答案,因?yàn)橛矌诺臄?shù)量是沒有限制的,子問題之間沒有相互制,是互相獨(dú)立的。

那么,既然知道了這是個(gè)動(dòng)態(tài)規(guī)劃問題,就要思考 如何列出正確的狀態(tài)轉(zhuǎn)移方程

先確定「狀態(tài)」 ,也就是原問題和子問題中變化的變量。由于硬幣數(shù)量無限,所以唯一的狀態(tài)就是目標(biāo)金額amount

然后確定dp函數(shù)的定義 :函數(shù) dp(n)表示,當(dāng)前的目標(biāo)金額是n,至少需要dp(n)個(gè)硬幣湊出該金額。

然后確定「選擇」并擇優(yōu) ,也就是對(duì)于每個(gè)狀態(tài),可以做出什么選擇改變當(dāng)前狀態(tài)。具體到這個(gè)問題,無論當(dāng)?shù)哪繕?biāo)金額是多少,選擇就是從面額列表coins中選擇一個(gè)硬幣,然后目標(biāo)金額就會(huì)減少:

# 偽碼框架
def coinChange(coins: List[int], amount: int):
    # 定義:要湊出金額 n,至少要 dp(n) 個(gè)硬幣
    def dp(n):
        # 做選擇,需要硬幣最少的那個(gè)結(jié)果就是答案
        for coin in coins:
            res = min(res, 1 + dp(n - coin))
        return res
    # 我們要求目標(biāo)金額是 amount
    return dp(amount)

最后明確 base case ,顯然目標(biāo)金額為 0 時(shí),所需硬幣數(shù)量為 0;當(dāng)目標(biāo)金額小于 0 時(shí),無解,返回 -1:

def coinChange(coins: List[int], amount: int):

    def dp(n):
        # base case
        if n == 0: return 0
        if n < 0: return -1
        # 求最小值,所以初始化為正無窮
        res = float('INF')
        for coin in coins:
            subproblem = dp(n - coin)
            # 子問題無解,跳過
            if subproblem == -1: continue
            res = min(res, 1 + subproblem)

        return res if res != float('INF') else -1

    return dp(amount)

至此,狀態(tài)轉(zhuǎn)移方程其實(shí)已經(jīng)完成了,以上算法已經(jīng)是暴力解法了,以上代碼的數(shù)學(xué)形式就是狀態(tài)轉(zhuǎn)移方程:

圖片

至此,這個(gè)問題其實(shí)就解決了,只不過需要消除一下重疊子問題,比如amount = 11, coins = {1,2,5}時(shí)畫出遞歸樹看看:

圖片

時(shí)間復(fù)雜度分析:子問題總數(shù) x 解決每個(gè)子問題的時(shí)間

子問題總數(shù)為遞歸樹節(jié)點(diǎn)個(gè)數(shù),這個(gè)比較難看出來,是 O(n^k),總之是指數(shù)級(jí)別的。每個(gè)子問題中含有一個(gè) for 循環(huán),復(fù)雜度為 O(k)。所以總時(shí)間復(fù)雜度為 O(k * n^k),指數(shù)級(jí)別。

2、帶備忘錄的遞歸

只需要稍加修改,就可以通過備忘錄消除子問題:

def coinChange(coins: List[int], amount: int):
    # 備忘錄
    memo = dict()
    def dp(n):
        # 查備忘錄,避免重復(fù)計(jì)算
        if n in memo: return memo[n]

        if n == 0: return 0
        if n < 0: return -1
        res = float('INF')
        for coin in coins:
            subproblem = dp(n - coin)
            if subproblem == -1: continue
            res = min(res, 1 + subproblem)

        # 記入備忘錄
        memo[n] = res if res != float('INF') else -1
        return memo[n]

    return dp(amount)

不畫圖了,很顯然「?jìng)渫洝勾蟠鬁p小了子問題數(shù)目,完全消除了子問題的冗余,所以子問題總數(shù)不會(huì)超過金額數(shù) n,即子問題數(shù)目為 O(n)。處理一個(gè)子問題的時(shí)間不變,仍是 O(k),所以總的時(shí)間復(fù)雜度是 O(kn)。

3、dp 數(shù)組的迭代解法

當(dāng)然,我們也可以自底向上使用 dp table 來消除重疊子問題,dp數(shù)組的定義和剛才dp函數(shù)類似,定義也是一樣的:

dp[i] = x表示,當(dāng)目標(biāo)金額為i時(shí),至少需要x枚硬幣

int coinChange(vector<int>& coins, int amount) {
    // 數(shù)組大小為 amount + 1,初始值也為 amount + 1
    vector<int> dp(amount + 1, amount + 1);
    // base case
    dp[0] = 0;
    for (int i = 0; i < dp.size(); i++) {
        // 內(nèi)層 for 在求所有子問題 + 1 的最小值
        for (int coin : coins) {
            // 子問題無解,跳過
            if (i - coin < 0) continue;
            dp[i] = min(dp[i], 1 + dp[i - coin]);
        }
    }
    return (dp[amount] == amount + 1) ? -1 : dp[amount];
}

圖片

PS:為啥dp數(shù)組初始化為amount + 1呢,因?yàn)闇惓?code>amount金額的硬幣數(shù)最多只可能等于amount(全用 1 元面值的硬幣),所以初始化為amount + 1就相當(dāng)于初始化為正無窮,便于后續(xù)取最小值。

三、最后總結(jié)

第一個(gè)斐波那契數(shù)列的問題,解釋了如何通過「?jìng)渫洝够蛘摺竏p table」的方法來優(yōu)化遞歸樹,并且明確了這兩種方法本質(zhì)上是一樣的,只是自頂向下和自底向上的不同而已。

第二個(gè)湊零錢的問題,展示了如何流程化確定「狀態(tài)轉(zhuǎn)移方程」,只要通過狀態(tài)轉(zhuǎn)移方程寫出暴力遞歸解,剩下的也就是優(yōu)化遞歸樹,消除重疊子問題而已。

如果你不太了解動(dòng)態(tài)規(guī)劃,還能看到這里,真得給你鼓掌,相信你已經(jīng)掌握了這個(gè)算法的設(shè)計(jì)技巧。

計(jì)算機(jī)解決問題其實(shí)沒有任何奇技淫巧,它唯一的解決辦法就是窮舉 ,窮舉所有可能性。算法設(shè)計(jì)無非就是先思考“如何窮舉”,然后再追求“如何聰明地窮舉”。

列出動(dòng)態(tài)轉(zhuǎn)移方程,就是在解決“如何窮舉”的問題。之所以說它難,一是因?yàn)楹芏喔F舉需要遞歸實(shí)現(xiàn),二是因?yàn)橛械膯栴}本身的解空間復(fù)雜,不那么容易窮舉完整。

備忘錄、DP table 就是在追求“如何聰明地窮舉”。用空間換時(shí)間的思路,是降低時(shí)間復(fù)雜度的不二法門,除此之外,試問,還能玩出啥花活?

聲明:本文內(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)投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    quartusII 詳細(xì)使用指南

    quartusII 詳細(xì)使用指南 應(yīng)該有用
    發(fā)表于 04-28 09:24

    動(dòng)態(tài)規(guī)劃算法。

    動(dòng)態(tài)規(guī)劃算法資料。
    發(fā)表于 08-30 20:44

    運(yùn)籌優(yōu)化之動(dòng)態(tài)規(guī)劃解析

    運(yùn)籌優(yōu)化(七)--動(dòng)態(tài)規(guī)劃解析
    發(fā)表于 05-12 09:57

    LCS的動(dòng)態(tài)規(guī)劃算法

    LCS的動(dòng)態(tài)規(guī)劃算法(自底向上)
    發(fā)表于 05-25 15:06

    動(dòng)態(tài)規(guī)劃與貪婪法題的背包問題總結(jié)

    【LeetCode & 劍指offer刷題】動(dòng)態(tài)規(guī)劃與貪婪法題16:背包問題總結(jié)
    發(fā)表于 06-09 16:44

    基于動(dòng)態(tài)規(guī)劃法的電力資源的合理分配

    通過實(shí)例在Matlab中展現(xiàn)了基于動(dòng)態(tài)規(guī)劃法,解決電力資源合理分配的問題,使得現(xiàn)實(shí)中電力資源的分配問題得到簡(jiǎn)化和程序化。結(jié)果顯示,動(dòng)態(tài)規(guī)劃法在電力資源的合理分配問題上比較實(shí)用
    發(fā)表于 12-07 14:15 ?19次下載

    智能控制的AGV路徑規(guī)劃研究_馬志遠(yuǎn)

    筆者簡(jiǎn)要介紹智能控制的AGV, 闡述其重要的兩個(gè)路徑規(guī)劃, 在靜態(tài)已知環(huán)境中的路徑規(guī)劃動(dòng)態(tài)復(fù)雜環(huán)境中的路徑規(guī)劃。其中
    發(fā)表于 08-29 15:02 ?14次下載

    基于動(dòng)態(tài)規(guī)劃的梯級(jí)泵站優(yōu)化調(diào)度研究_專祥濤

    基于動(dòng)態(tài)規(guī)劃的梯級(jí)泵站優(yōu)化調(diào)度研究_專祥濤
    發(fā)表于 01-21 12:16 ?0次下載

    基于時(shí)延Q學(xué)習(xí)的機(jī)器人動(dòng)態(tài)規(guī)劃方法

    機(jī)器人動(dòng)態(tài)規(guī)劃是指在某一個(gè)給定的運(yùn)行空間中,移動(dòng)機(jī)器人通過路徑的動(dòng)態(tài)規(guī)劃來獲得一條從初始位置到目標(biāo)位置的最優(yōu)路徑。環(huán)境未知的情況的機(jī)器人路
    發(fā)表于 11-28 17:01 ?0次下載
    基于時(shí)延Q學(xué)習(xí)的機(jī)器人<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>規(guī)劃</b>方法

    分層學(xué)習(xí)的自適應(yīng)動(dòng)態(tài)規(guī)劃

    本文基于嬰兒的認(rèn)知發(fā)育模型LOC (Levels of Consciousness)提出了基于分層學(xué)習(xí)的自適應(yīng)動(dòng)態(tài)規(guī)劃方法以改進(jìn)學(xué)習(xí)和優(yōu)化。根據(jù)LOC模型中感知的層次性以及工作目標(biāo)的層次定義,為
    發(fā)表于 01-05 15:13 ?0次下載
    分層學(xué)習(xí)的自適應(yīng)<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>規(guī)劃</b>

    動(dòng)態(tài)規(guī)劃方法的利用matlab實(shí)現(xiàn)及其應(yīng)用的有效工具詳細(xì)資料概述

    本文運(yùn)用 matlab 語言實(shí)現(xiàn)了動(dòng)態(tài)規(guī)劃的逆序算法,根據(jù)狀態(tài)變量的維數(shù),編寫了指標(biāo)函數(shù)最小值的逆序算法遞歸計(jì)算程序。兩個(gè)實(shí)例的應(yīng)用檢驗(yàn)了該程序的有效性,同時(shí)也表明了該算法程序?qū)Ρ姸囝惖湫偷?b class='flag-5'>動(dòng)態(tài)
    發(fā)表于 06-14 08:00 ?5次下載
    <b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>規(guī)劃</b>方法的利用matlab實(shí)現(xiàn)及其應(yīng)用的有效工具<b class='flag-5'>詳細(xì)</b>資料概述

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

    首先必須要說明,這個(gè)題目的狀態(tài)轉(zhuǎn)移方程真的比較巧妙,所以說如果你看了題目之后完全沒有思路恰恰是正常的。雖然最優(yōu)答案不容易想出來,但基本的思路分析是我們應(yīng)該力求做到的。所以本文會(huì)先分析一常規(guī)思路,然后再引入動(dòng)態(tài)規(guī)劃解法。
    的頭像 發(fā)表于 06-03 17:29 ?2436次閱讀
    經(jīng)典<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>規(guī)劃</b>:戳氣球問題

    動(dòng)態(tài)規(guī)劃和遞歸有什么區(qū)別和聯(lián)系

    ? 前言 大家好,我是bigsai,好久不見,甚是想念(天天想念)! 很久前就有小伙伴被動(dòng)態(tài)規(guī)劃所折磨,確實(shí),很多題動(dòng)態(tài)規(guī)劃確實(shí)太難看出了了,甚至有的題看了題解理解起來都費(fèi)勁半天。
    的頭像 發(fā)表于 11-16 17:27 ?3540次閱讀

    動(dòng)態(tài)規(guī)劃詳細(xì)指南(上)

    動(dòng)態(tài)規(guī)劃問題的一般形式就是求最值 。動(dòng)態(tài)規(guī)劃其實(shí)是運(yùn)籌學(xué)的一種最優(yōu)化方法,只不過在計(jì)算機(jī)問題上應(yīng)用比較多,比如說讓你求最長(zhǎng)遞增子序列呀,最小編輯距離呀等等。
    的頭像 發(fā)表于 04-19 10:25 ?744次閱讀
    <b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>規(guī)劃</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>指南</b>(上)

    AGV小車中的動(dòng)態(tài)路徑規(guī)劃算法揭秘

    并非一成不變時(shí),動(dòng)態(tài)路徑規(guī)劃能力就顯得至關(guān)重要。本文將深入探討幾種主流的動(dòng)態(tài)路徑規(guī)劃算法(如A、Dijkstra、RRT等),并解析它們?nèi)绾卧贏GV行業(yè)中大顯身手。 為何需要
    的頭像 發(fā)表于 06-17 15:54 ?248次閱讀
    AGV小車中的<b class='flag-5'>動(dòng)態(tài)</b>路徑<b class='flag-5'>規(guī)劃</b>算法揭秘
    主站蜘蛛池模板: 麻阳| 曲靖市| 红桥区| 杨浦区| 定安县| 团风县| 北宁市| 西丰县| 美姑县| 广宗县| 黑水县| 吉木萨尔县| 天台县| 安乡县| 广元市| 子长县| 阿坝| 南皮县| 宁安市| 兰溪市| 吉安市| 安福县| 襄汾县| 滦南县| 图片| 崇礼县| 峨边| 汶川县| 湛江市| 商丘市| 黄山市| 闸北区| 若羌县| 绵阳市| 灯塔市| 安塞县| 栾川县| 七台河市| 新民市| 紫云| 黎平县|