国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【算法思考記錄】動態(tài)規(guī)劃入門!力扣2606. 找到最大開銷的子字符串【Python3、動態(tài)規(guī)劃】

這篇具有很好參考價值的文章主要介紹了【算法思考記錄】動態(tài)規(guī)劃入門!力扣2606. 找到最大開銷的子字符串【Python3、動態(tài)規(guī)劃】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

原題鏈接


動態(tài)規(guī)劃基本原理

動態(tài)規(guī)劃(Dynamic Programming,簡稱 DP)是一種通過將原問題分解為相互重疊的子問題并只解決一次的方法來解決問題的算法優(yōu)化技術(shù)。動態(tài)規(guī)劃通常用于優(yōu)化遞歸問題,通過存儲子問題的解來避免重復(fù)計算,從而顯著提高算法的效率。

基本思想

動態(tài)規(guī)劃的基本思想是將原問題劃分為若干個子問題,通過解決子問題得到原問題的解。在這個過程中,動態(tài)規(guī)劃使用了最優(yōu)子結(jié)構(gòu)重疊子問題兩個關(guān)鍵性質(zhì)。

  1. 最優(yōu)子結(jié)構(gòu):問題的最優(yōu)解可以通過子問題的最優(yōu)解來構(gòu)造。即,全局最優(yōu)解包含了所有局部最優(yōu)解。

  2. 重疊子問題:在遞歸求解過程中,對于一些子問題的解會被多次使用。為了避免重復(fù)計算,我們可以將子問題的解存儲起來,后續(xù)直接使用,這就是動態(tài)規(guī)劃中的記憶化。

基本步驟

動態(tài)規(guī)劃通常包含以下基本步驟:

  1. 定義狀態(tài):明確定義問題的狀態(tài),找出問題中具有變化的量,并將其表示為狀態(tài)。狀態(tài)是原問題和子問題中變化的量。

  2. 找到狀態(tài)轉(zhuǎn)移方程:建立狀態(tài)之間的關(guān)系,即如何由小的子問題推導(dǎo)出大問題的解。狀態(tài)轉(zhuǎn)移方程是動態(tài)規(guī)劃的核心。

  3. 初始化:設(shè)置問題的初始值,通常是最簡單的情況,這是遞歸或迭代的終止條件。

  4. 遞推計算:按照狀態(tài)轉(zhuǎn)移方程,從初始狀態(tài)開始遞推計算,直到計算出原問題的解。

  5. 解決原問題:得到原問題的解,這通常是在狀態(tài)中已經(jīng)計算得到的值。

應(yīng)用領(lǐng)域

動態(tài)規(guī)劃廣泛應(yīng)用于各個領(lǐng)域,包括但不限于:

  • 優(yōu)化問題:如最短路徑、最長子序列、背包問題等。
  • 計算問題:如斐波那契數(shù)列、組合數(shù)等。
  • 決策問題:如股票買賣、任務(wù)調(diào)度等。

總的來說,動態(tài)規(guī)劃通過將復(fù)雜問題分解為簡單的子問題,并有效地保存子問題的解,從而在時間和空間上實現(xiàn)了高效的問題求解。

找到最大開銷的子字符串算法解析

問題描述

給定一個字符串 s,一個字符互不相同的字符串 chars 和一個長度與 chars 相同的整數(shù)數(shù)組 vals。子字符串的開銷是一個子字符串中所有字符對應(yīng)價值之和,空字符串的開銷是 0。

字符的價值定義如下:

  • 如果字符不在字符串 chars 中,那么它的價值是它在字母表中的位置(下標(biāo)從 1 開始)。
  • 如果字符在 chars 中的位置為 i,那么它的價值就是 vals[i]

問題要求返回字符串 s 的所有子字符串中的最大開銷。

思路

題目要求找到最大開銷的子字符串,我們可以使用動態(tài)規(guī)劃的思路解決。在這里,我們使用一個一維數(shù)組 dp 來記錄以字符串 s 的每一位結(jié)尾的最大開銷。

狀態(tài)定義

我們定義 dp[i] 為以字符串 s 的第 i 位結(jié)尾的最大開銷。

狀態(tài)轉(zhuǎn)移

狀態(tài)轉(zhuǎn)移方程為 dp[i] = max(dp[i - 1] + char_val, char_val),其中 char_val 是第 i 個字符對應(yīng)的開銷值。

代碼實現(xiàn)

class Solution:
    def maximumCostSubstring(self, s: str, chars: str, vals: List[int]) -> int:
        char_idx = {}
        for idx, char in enumerate(chars):
            char_idx[char] = idx
        n = len(s)
        dp = [0] * n
        dp[0] = vals[char_idx[s[0]]] if s[0] in char_idx else ord(s[0]) - ord('a') + 1
        ans = max(dp[0], 0)
        for i in range(1, n):
            new_char_val = vals[char_idx[s[i]]] if s[i] in char_idx else (ord(s[i]) - ord('a') + 1)
            dp[i] = max(dp[i - 1] + new_char_val, new_char_val)
            ans = max(ans, dp[i])

        return ans

示例分析

示例 1

s = "adaa"
chars = "d"
vals = [-1000]
solution = Solution()
result = solution.maximumCostSubstring(s, chars, vals)
print(result)  # Output: 2

解釋:字符 “a” 和 “d” 的價值分別為 1 和 -1000。最大開銷子字符串是 “aa”,它的開銷為 1 + 1 = 2。2 是最大開銷。

示例 2

s = "abc"
chars = "abc"
vals = [-1,-1,-1]
solution = Solution()
result = solution.maximumCostSubstring(s, chars, vals)
print(result)  # Output: 0

解釋:字符 “a”,“b” 和 “c” 的價值分別為 -1,-1 和 -1。最大開銷子字符串是 “”,它的開銷為 0。0 是最大開銷。

復(fù)雜度分析

時間復(fù)雜度

遍歷字符串 s 一次,每次更新 dp[i] 的操作為 O(1),因此總時間復(fù)雜度為 O(n)。

空間復(fù)雜度

使用了額外的空間來存儲 dp 數(shù)組和 char_idx 字典,因此空間復(fù)雜度為 O(n)。文章來源地址http://www.zghlxwxcb.cn/news/detail-773153.html

到了這里,關(guān)于【算法思考記錄】動態(tài)規(guī)劃入門!力扣2606. 找到最大開銷的子字符串【Python3、動態(tài)規(guī)劃】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【算法】力扣【動態(tài)規(guī)劃,LCS】1143. 最長公共子序列

    1143. 最長公共子序列 本文是對 LCS 這一 動態(tài)規(guī)劃 模型的整理,以力扣平臺上的算法題1143:最長公共子序列為模板題進(jìn)行解析。 該題目要求計算兩個字符串的最長公共子序列(Longest Common Subsequence,簡稱LCS)的長度。字符串的子序列是指在不改變字符順序的情況下,通過刪去

    2024年01月17日
    瀏覽(27)
  • 算法50:動態(tài)規(guī)劃專練(力扣514題:自由之路-----4種寫法)

    算法50:動態(tài)規(guī)劃專練(力扣514題:自由之路-----4種寫法)

    題目: 力扣514 : 自由之路??. - 力扣(LeetCode) 題目的詳細(xì)描述,直接打開力扣看就是了,下面說一下我對題目的理解: 事例1: 1. ring的第一個字符默認(rèn)是指向12點(diǎn)方向的,這一點(diǎn)很重要 2. key的第一個字符為g,而ring中首字符和末尾字符都為g。因此,必然存在選擇首字符的g還

    2024年04月15日
    瀏覽(20)
  • 【算法】力扣【動態(tài)規(guī)劃、狀態(tài)機(jī)】309. 買賣股票的最佳時機(jī)含冷凍期

    309. 買賣股票的最佳時機(jī)含冷凍期 本文介紹解決力扣平臺上第309號問題——“買賣股票的最佳時機(jī)含冷凍期”的算法。這是一個中等難度的問題,其核心是通過設(shè)計一個算法來計算在給定的股票價格數(shù)組 prices 下,能夠獲取的最大利潤。股票價格數(shù)組 prices 中的每個元素 pric

    2024年01月18日
    瀏覽(26)
  • 力扣算法刷題Day39|動態(tài)規(guī)劃:不同路徑 I&II

    力扣題目:#62.不同路徑 刷題時長:參考題解后10min 解題方法:動規(guī) 復(fù)雜度分析 時間O(m*n) 空間O(m*n) 問題總結(jié) 初始化二維數(shù)組的python語法:i 對應(yīng) m,j 對應(yīng)n 二維遍歷順序,從上到下從左到右通過兩層for循環(huán)實現(xiàn),其中startindex應(yīng)為1 本題收獲 動規(guī)思路 確定dp數(shù)組及下標(biāo)的含義

    2024年02月12日
    瀏覽(19)
  • 算法記錄 | 48 動態(tài)規(guī)劃

    思路: 1.確定dp數(shù)組(dp table)以及下標(biāo)的含義: dp[i]:前 i 間房屋所能偷竊到的最高金額。 2.確定遞推公式: dp[i] = max(dp[i - 2] + nums[i-1], dp[i - 1]) i間房屋的最后一個房子是nums[i?1]。 如果房屋數(shù)大于等于 2 間,則偷竊第 i?1 間房屋的時候,就有兩種狀態(tài): 偷竊第 i?1 間房屋

    2024年02月05日
    瀏覽(17)
  • 算法學(xué)習(xí)記錄:動態(tài)規(guī)劃

    算法學(xué)習(xí)記錄:動態(tài)規(guī)劃

    目錄 前言: 背景知識: 正文: ?什么是動態(tài)規(guī)劃(更新中): ?理解動態(tài)規(guī)劃: 狀態(tài): 狀態(tài)轉(zhuǎn)移: ?運(yùn)用動態(tài)規(guī)劃(分析步驟): 例題集(時間順序)? 1.藍(lán)橋OJ 3820:混境之地5(DFS) 2.藍(lán)橋OJ 216:地宮取寶(DFS) 3.藍(lán)橋OJ 1536:數(shù)字三角形(迭代法) 4.藍(lán)橋OJ 3367:破損的

    2024年01月25日
    瀏覽(21)
  • 力扣算法刷題Day42|動態(tài)規(guī)劃:01背包問題 分割等和子集

    力扣題目:01背包問題(二維數(shù)組) 刷題時長:參考題解 解題方法:動態(tài)規(guī)劃 +?二維dp數(shù)組 復(fù)雜度分析 時間 空間 問題總結(jié) 理解遞推公式困難 本題收獲 動規(guī)思路:兩層for循環(huán),第一層i遍歷物品,第二層j枚舉背包容量以內(nèi)所有值 確定dp數(shù)組及下標(biāo)的含義:dp[i][j] 表示從下標(biāo)

    2024年02月13日
    瀏覽(94)
  • 算法記錄 | Day38 動態(tài)規(guī)劃

    算法記錄 | Day38 動態(tài)規(guī)劃

    對于動態(tài)規(guī)劃問題,將拆解為如下五步曲 確定dp數(shù)組(dp table)以及下標(biāo)的含義 確定遞推公式 dp數(shù)組如何初始化 確定遍歷順序 舉例推導(dǎo)dp數(shù)組 思路: 確定dp數(shù)組(dp table)以及下標(biāo)的含義:dp[i]的定義為:第i個數(shù)的斐波那契數(shù)值是dp[i] 確定遞推公式:狀態(tài)轉(zhuǎn)移方程 dp[i] = dp

    2023年04月22日
    瀏覽(24)
  • 算法記錄 | Day46 動態(tài)規(guī)劃

    算法記錄 | Day46 動態(tài)規(guī)劃

    思路: 1.確定dp數(shù)組以及下標(biāo)的含義 dp[i] : 字符串長度為i的話,dp[i]為true,表示可以拆分為一個或多個在字典中出現(xiàn)的單詞 。 2.確定遞推公式 如果 s[0: j] 可以拆分為單詞(即 dp[j] == True ),并且字符串 s[j: i] 出現(xiàn)在字典中,則 dp[i] = True 。 如果 s[0: j] 不可以拆分為單詞(即

    2024年02月02日
    瀏覽(19)
  • 算法記錄 | Day53 動態(tài)規(guī)劃

    算法記錄 | Day53 動態(tài)規(guī)劃

    思路: 本題和動態(tài)規(guī)劃:718. 最長重復(fù)子數(shù)組 (opens new window)區(qū)別在于這里不要求是連續(xù)的了,但要有相對順序,即:“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。 1.確定dp數(shù)組(dp table)以及下標(biāo)的含義 dp[i][j] :長度為[0, i - 1]的字符串text1與長度為[0,

    2024年02月03日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包