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

「程序員必須掌握的算法」動(dòng)態(tài)規(guī)劃「上篇」

這篇具有很好參考價(jià)值的文章主要介紹了「程序員必須掌握的算法」動(dòng)態(tài)規(guī)劃「上篇」。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

動(dòng)態(tài)規(guī)劃詳解

動(dòng)態(tài)規(guī)劃 (Dynamic Programming) 是一種算法思想,用于解決一些復(fù)雜的問題。本文將介紹動(dòng)態(tài)規(guī)劃的分類、概念和經(jīng)典例題講解。

動(dòng)態(tài)規(guī)劃的分類

動(dòng)態(tài)規(guī)劃可以分為以下兩種類型:

  1. 0/1背包問題:該問題是動(dòng)態(tài)規(guī)劃的一種基本類型。在背包問題中,有n個(gè)物品可以放入容量為W的背包中,每個(gè)物品有自己的重量和價(jià)值。需要選擇哪些物品能夠最大化背包的總價(jià)值。
  2. 最長公共子序列問題:該問題是另一種經(jīng)典的動(dòng)態(tài)規(guī)劃類型,涉及到兩個(gè)字符串,并找到這兩個(gè)字符串之間的最長公共子序列。

動(dòng)態(tài)規(guī)劃的概念

在解決動(dòng)態(tài)規(guī)劃問題時(shí),我們需要定義以下概念:

  1. 狀態(tài) (State):問題中需要優(yōu)化的變量,如背包問題中的容量,最長公共子序列問題中的字符串長度等。
  2. 狀態(tài)轉(zhuǎn)移方程 (State Transition Equation):描述狀態(tài)之間的轉(zhuǎn)移過程,即問題的遞推關(guān)系。例如,在背包問題中,每個(gè)物品可以放入背包或不放入背包。因此,狀態(tài)轉(zhuǎn)移方程可以表示為: d p [ i ] [ j ] = max ? ( d p [ i ? 1 ] [ j ] , d p [ i ? 1 ] [ j ? w i ] + v i ) dp[i][j] = \max(dp[i-1][j], dp[i-1][j-w_i]+v_i) dp[i][j]=max(dp[i?1][j],dp[i?1][j?wi?]+vi?) 其中dp[i][j]表示在使用前i個(gè)物品時(shí),填滿j容量的背包的最大價(jià)值。
  3. 初始狀態(tài) (Initial State):問題的初始條件,通常為問題規(guī)模最小的情況下的答案。在背包問題中,初始狀態(tài)為dp[0][0]=0。
  4. 邊界狀態(tài) (Boundary State):問題的邊界條件,在狀態(tài)轉(zhuǎn)移過程中需要特別處理的狀態(tài)。在背包問題中,背包的容量不能為負(fù)數(shù),因此需要在狀態(tài)轉(zhuǎn)移方程中特別處理。

經(jīng)典例題講解

下面我們將分別介紹0/1背包問題和最長公共子序列問題的解法。

1. 0/1背包問題

題目描述:有n個(gè)物品和一個(gè)容量為W的背包。第i個(gè)物品的重量為wi,價(jià)值為vi?,F(xiàn)在,需要選擇一些物品放入背包,使得放入的物品的總重量不超過W,且總價(jià)值最大。求最大價(jià)值。

解題思路:定義狀態(tài)dp[i][j]為在使用前i個(gè)物品時(shí),填滿j容量的背包的最大價(jià)值。狀態(tài)轉(zhuǎn)移方程如下所示: d p [ i ] [ j ] = { d p [ i ? 1 ] [ j ] , j < w i max ? ( d p [ i ? 1 ] [ j ] , d p [ i ? 1 ] [ j ? w i ] + v i ) , j ≥ w i dp[i][j] = \begin{cases}dp[i-1][j],&j<w_i\\ \max(dp[i-1][j], dp[i-1][j-w_i]+v_i),&j\ge w_i\end{cases} dp[i][j]={dp[i?1][j],max(dp[i?1][j],dp[i?1][j?wi?]+vi?),?j<wi?jwi?? 其中dp[i-1][j]表示不放入第i個(gè)物品的最大價(jià)值,dp[i-1][j-w[i]]+v[i]表示將第i個(gè)物品加入背包的最大價(jià)值。需要注意的是,如果當(dāng)前背包容量小于物品的重量,就不能將該物品放入背包。因此,需要特別處理背包容量小于物品重量的情況。

代碼實(shí)現(xiàn):

int dp[101][1001];
int weight[101], value[101];

int knapSack(int n, int w)
{
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= w; j++) {
            if (j < weight[i]) {
                dp[i][j] = dp[i-1][j];
            } else {
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]);
            }
        }
    }
    return dp[n][w];
}

2. 最長公共子序列問題

題目描述:給定兩個(gè)字符串A和B,找到它們的最長公共子序列 (LCS)。

解題思路:定義狀態(tài)dp[i][j]為字符串A的前i個(gè)字符和字符串B的前j個(gè)字符的LCS長度。狀態(tài)轉(zhuǎn)移方程如下所示:

d p [ i ] [ j ] = { 0 , i = 0 或 j = 0 d p [ i ? 1 ] [ j ? 1 ] + 1 , A i = B j max ? ( d p [ i ? 1 ] [ j ] , d p [ i ] [ j ? 1 ] ) , A i ≠ B j dp[i][j] = \begin{cases}0,&i=0\text{或}j=0\\ dp[i-1][j-1]+1,&A_i=B_j\\ \max(dp[i-1][j], dp[i][j-1]),&A_i\neq B_j\end{cases} dp[i][j]=? ? ??0,dp[i?1][j?1]+1,max(dp[i?1][j],dp[i][j?1]),?i=0j=0Ai?=Bj?Ai?=Bj??

當(dāng)A[i-1]等于B[j-1]時(shí),dp[i][j]等于dp[i-1][j-1]+1,表示A和B中的相同字符加上它們前面的LCS。當(dāng)它們不相等時(shí),LCS為它們前面的LCS的最大值,即dp[i-1][j]和dp[i][j-1]的最大值。

代碼實(shí)現(xiàn):

int dp[1001][1001];
string A, B;

int LCS(int n, int m)
{
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            if (i == 0 || j == 0) {
                dp[i][j] = 0;
            } else if (A[i-1] == B[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            } else {
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            }
        }
    }
    return dp[n][m];
}

結(jié)語

動(dòng)態(tài)規(guī)劃是一種非常重要的算法思想,它通常用于解決復(fù)雜的問題。在應(yīng)用動(dòng)態(tài)規(guī)劃解決問題時(shí),需要注意定義狀態(tài)、狀態(tài)轉(zhuǎn)移方程、初始狀態(tài)和邊界狀態(tài)等概念。對于不同類型的動(dòng)態(tài)規(guī)劃問題,需要采用不同的解決方法。希望本文能夠幫助讀者加深對動(dòng)態(tài)規(guī)劃的理解。文章來源地址http://www.zghlxwxcb.cn/news/detail-733647.html

到了這里,關(guān)于「程序員必須掌握的算法」動(dòng)態(tài)規(guī)劃「上篇」的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 程序員必須掌握哪些算法?——前端開發(fā)工程師需要掌握的算法

    程序員必須掌握哪些算法?——前端開發(fā)工程師需要掌握的算法

    一個(gè)程序員一生中可能會(huì)邂逅各種各樣的算法,但總有那么幾種,是作為一個(gè)程序員一定會(huì)遇見且大概率需要掌握的算法。作為一名前端開發(fā)工程師,今天就通過這個(gè)話題和文章來聊聊前端開發(fā)工程師需要掌握的算法有哪些呢。 算法(Algorithm) 是指解題方案的準(zhǔn)確而完整的

    2024年02月15日
    瀏覽(96)
  • 「必學(xué)算法」- 作為一個(gè)程序員,你一生中必須掌握的幾種算法

    「必學(xué)算法」- 作為一個(gè)程序員,你一生中必須掌握的幾種算法

    作為一個(gè)程序員,學(xué)習(xí)算法是不可避免的一個(gè)過程。算法不僅可以提高編程能力,也可以讓我們更好地應(yīng)對各種實(shí)際問題。在實(shí)際編程過程中,我們經(jīng)常會(huì)用到一些常見的算法,這些算法具有廣泛的應(yīng)用,掌握它們對提升編程能力和解決實(shí)際問題非常有幫助。 下面列舉了一些

    2024年02月17日
    瀏覽(28)
  • 9個(gè)程序員必須掌握的Git命令

    9個(gè)程序員必須掌握的Git命令

    介紹一些非常實(shí)用的Git命令。 微信搜索關(guān)注《Java學(xué)研大本營》 Git是最常用的版本控制系統(tǒng)之一。然而,對于初學(xué)者來說,Git的眾多命令和工作流程會(huì)讓人感到困惑和棘手。在Git的世界中很容易迷失,遇到合并沖突錯(cuò)誤和意外更改,Git對于新手來說可能真的是一場噩夢。 本文

    2024年01月21日
    瀏覽(90)
  • Kali中搭建vulhub時(shí)鏡像git失敗_vulhub git,每個(gè)程序員都必須掌握的8種數(shù)據(jù)結(jié)構(gòu)

    Kali中搭建vulhub時(shí)鏡像git失敗_vulhub git,每個(gè)程序員都必須掌握的8種數(shù)據(jù)結(jié)構(gòu)

    先自我介紹一下,小編浙江大學(xué)畢業(yè),去過華為、字節(jié)跳動(dòng)等大廠,目前阿里P7 深知大多數(shù)程序員,想要提升技能,往往是自己摸索成長,但自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前! 因此收集整理了一份《2024年最新網(wǎng)絡(luò)安全全套學(xué)習(xí)資料》

    2024年04月27日
    瀏覽(90)
  • 學(xué)PYTHON必須學(xué)算法嗎?老程序員告訴你真相!

    學(xué)PYTHON必須學(xué)算法嗎?老程序員告訴你真相!

    通過以上所學(xué)內(nèi)容大家就可以比較清楚的了解到Python編程學(xué)完可以做什么了,主要可以選擇的工作我挑了以下幾個(gè)介紹: (1) 大數(shù)據(jù)分析師 :基于各種分析手段對大數(shù)據(jù)進(jìn)行科學(xué)分析、挖掘、展現(xiàn)并用于決策支持。使企業(yè)清晰的了解到現(xiàn)狀及競爭環(huán)境。 (2) 人工智能 :

    2024年02月06日
    瀏覽(104)
  • 作為一個(gè)程序員一定要掌握的算法之遺傳算法

    作為一個(gè)程序員一定要掌握的算法之遺傳算法

    目錄 一、引言 1.1 目的 1.2 意義 二、遺傳算法介紹 2.1 遺傳算法的基本思想 2.2 遺傳算法與其他算法的主要區(qū)別 2.3 基于Java的遺傳算法設(shè)計(jì)思想 三、遺傳算法的具體實(shí)現(xiàn) 3.1?系統(tǒng)功能模塊圖和說明 3.2 代碼和說明 3.2.1 初始化 3.2.2 選擇運(yùn)算 3.2.3 交叉運(yùn)算 3.2.4 變異運(yùn)算 3.2.5 主函

    2024年02月15日
    瀏覽(96)
  • 探索編程世界的寶藏:程序員必掌握的20大算法

    探索編程世界的寶藏:程序員必掌握的20大算法

    #程序員必須掌握哪些算法?# 在當(dāng)今數(shù)字化時(shí)代,程序員們?nèi)匀恍枰獡碛幸话呀鉀Q問題和優(yōu)化代碼的金鑰匙。這些鑰匙是算法,它們隱藏在計(jì)算機(jī)科學(xué)的寶藏中,等待著我們?nèi)グl(fā)現(xiàn)和掌握。本篇博文將帶你踏上一段引人入勝的探險(xiǎn)之旅,揭開程序員必須掌握的20大算法的神秘

    2024年02月14日
    瀏覽(1524)
  • 有哪些數(shù)據(jù)結(jié)構(gòu)與算法是程序員必須要掌握的?——“數(shù)據(jù)結(jié)構(gòu)與算法”

    有哪些數(shù)據(jù)結(jié)構(gòu)與算法是程序員必須要掌握的?——“數(shù)據(jù)結(jié)構(gòu)與算法”

    作為IT程序員,學(xué)習(xí)算法的原因主要有以下幾點(diǎn): 提升問題解決能力:算法可以幫助程序員分析、優(yōu)化和解決復(fù)雜問題。了解算法原理和實(shí)現(xiàn)方式將有助于程序員更快地找到合適的解決方案。這對于解決實(shí)際工作中的問題是非常有幫助的。 提高代碼效率:通過學(xué)習(xí)不同的算法

    2024年02月13日
    瀏覽(29)
  • 《程序員面試金典(第6版)》 面試題 08.11. 硬幣(動(dòng)態(tài)規(guī)劃,組合問題,C++)

    《程序員面試金典(第6版)》 面試題 08.11. 硬幣(動(dòng)態(tài)規(guī)劃,組合問題,C++)

    硬幣。給定數(shù)量不限的硬幣,幣值為25分、10分、5分和1分,編寫代碼計(jì)算n分有幾種表示法。(結(jié)果可能會(huì)很大,你需要將結(jié)果模上1000000007) 示例1: 輸入: n = 5 輸出:2 解釋: 有兩種方式可以湊成總金額: 5=5 5=1+1+1+1+1 示例2: 輸入: n = 10 輸出:4 解釋: 有四種方式可以湊成總金額: 1

    2023年04月08日
    瀏覽(19)
  • 程序員必須了解的 10個(gè)免費(fèi) Devops 工具

    程序員必須了解的 10個(gè)免費(fèi) Devops 工具

    近年來,DevOps 已經(jīng)成為一門將軟件開發(fā) (Dev) 與 IT 運(yùn)維 (Ops) 相融合的重要學(xué)科,目的是為了縮短軟件的開發(fā)生命周期并提供高質(zhì)量軟件的持續(xù)交付。 這篇文章整理了十種基本的免費(fèi)開源的 DevOps 工具,這些工具已經(jīng)在實(shí)踐中得到了證明,憑借有效性和能夠簡化 DevOps 流程的能

    2024年04月11日
    瀏覽(89)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包