關於 DP 的一些內容

来源:https://www.cnblogs.com/Quantum-Coke-Machine/archive/2019/12/25/12099675.html
-Advertisement-
Play Games

0.關於 動態規劃 是編程解題的一種重要手段。 年美國數學家 等人,根據一類多階段問題的特點,把多階段決策問題變換為一系列互相聯繫的單階段問題,然後逐個加以解決。與此同時,他提出瞭解決這類問題的“最優化原理”,從而創建瞭解決最優化問題的一種新方法: 動態規劃 。 動態規划算法 通常用於求解具有 某種 ...


0.關於

        動態規劃是編程解題的一種重要手段。1951 年美國數學家 R.Bellman 等人,根據一類多階段問題的特點,把多階段決策問題變換為一系列互相聯繫的單階段問題,然後逐個加以解決。與此同時,他提出瞭解決這類問題的“最優化原理”,從而創建瞭解決最優化問題的一種新方法:動態規劃
        動態規划算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解
        我們可以用一個表來記錄所有已解的子問題的答案。不管該子問題以後是否被用到,只要它被計算過,就將其結果填入表中。這就是動態規劃法的基本思路。具體的動態規划算法多種多樣,但它們具有相同的填表格式

1.基本概念

        · 階段:把所給問題的求解過程恰當地分成若幹個相互聯繫的階段,以便於求解。過程不同,階段數就可能不同。描述階段的變數稱為階段變數,常用 k 表示。階段的劃分,一般是根據時間和空間的自然特征來劃分,但要便於把問題的過程轉化為多階段決策的過程。
        · 狀態:狀態表示每個階段開始面臨的自然狀況或客觀條件,它不以人們的主觀意志為轉移,也稱為不可控因素。通常一個階段有若幹個狀態,狀態通常可以用一個或一組數來描述,稱為狀態變數。
        · 決策:表示當過程處於某一階段的某個狀態時,可以做出不同的決定,從而確定下一階段的狀態,這種決定稱為決策。不同的決策對應著不同的數值,描述決策的變數稱決策變數。
        · 狀態轉移方程:動態規劃中本階段的狀態往往是上一階段的狀態和上一階段的決策的結果,由第 i 段的狀態 f(i) ,和決策 u(i) 來確定第 i+1 段的狀態。狀態轉移表示為 F(i+1) = T(f(i),u(i)) ,稱為狀態轉移方程。
        · 策略:各個階段決策確定後,整個問題的決策序列就構成了一個策略,對每個實際問題,可供選擇的策略有一定範圍,稱為允許策略集合。允許策略集合中達到最優效果的策略稱為最優策略。

動態規劃必須滿足最優化原理與無後效性。

        · 最優化原理:“一個過程的最優決策具有這樣的性質:即無論其初始狀態和初始決策如何,其今後諸策略對以第一個決策所形成的狀態作為初始狀態的過程而言,必須構成最優策略”。也就是說一個最優策略的子策略,也是最優的。
        · 無後效性:如果某階段狀態給定後,則在這個階段以後過程的發展不受這個階段以前各個狀態的影響。

舉個慄子

來看一道題目。

可憐的可樂機要回家,已知小可樂機在 左下角 (1,1) 位置,家在 右上角 (n,n) 坐標處。小可樂機走上一個格子 (i,j) 會花費一定的體力 a[i][j],而且小可樂機只會往家的方向走,也就是只能往上,或者往右走。小可樂機想知道他回到家需要花費的最少體力是多少, 求你幫幫小可樂機吧qwq

例如下圖所示,格子中的數字代表走上該格子花費的體力:
可樂機回家.png
對於該圖來說,最優策略已在圖上標出,最少花費體力為:3 + 2 + 4 + 3 = 123 + 2 + 4 + 3 = 12。

我們把走到一個點看做一個狀態,對小可樂機來說,走到一個點只有兩種方式,一個是從下麵走到該點,一種是從左邊走到該點。那麼點 (i,j) 要麼是從 (i-1,j) 走到 (i,j),要麼是從點 (i,j-1) 走到 (i,j)。

所以從哪個點走到 (i,j) 就是一個 決策。接下來,我們用 dp(i,j) 來代表走到點 (i,j) 一共花費的最少體力。
我們需要花費最少力氣走到家,所以可以得到狀態轉移方程:dp(i,j) = min(dp(i-1,j), dp(i,j-1)) + a[i][j] 。根據轉移方程,我們可以推出走到每個點花費的最少體力。

對於圖中的邊界點,要在轉移前加上判斷是否為邊界,如:點 (1,3) 只能從點 (1,2) 走過來,點 (3,1) 只能從點 (2,1) 走過來等等。

動態規劃的題目的核心是寫出狀態轉移方程,對於一個動態規劃的題目,如果我們能寫出轉移方程那麼代碼實現就變得簡單多了。大部分的動態規劃題目,在計算出轉移方程後,可以用類似於遞推的迴圈結構,來寫出代碼。

主要代碼

int a[100][100]; // a數組代表在點(i,j)花費的體力
int dp[100][100]; // dp數組代表走到點(i,j)一共花費的最少體力
dp[1][1] = 0;
for (int i = 1; i <= n; i++) 
{
    for (int j = 1; j <= n; j++)
    {
        if (i == 1 && j == 1) 
        {
            continue;
        } 
        else if (i == 1) //邊界點
        { 
            dp[i][j] = dp[i][j-1] + a[i][j];
        } 
        else if (j == 1)  //邊界點
        {
            dp[i][j] = dp[i-1][j] + a[i][j];
        } 
        else 
        {
            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + a[i][j]; //轉移方程
        }
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Javascript聲明變數的,雖然用var關鍵字聲明和不用關鍵字聲明,很多時候運行並沒有問題,但是這兩種方式還是有區別的。可以正常運行的代碼並不代表是合適的代碼。 varnum=1; 是在當前域中聲明變數。如果在方法中聲明,則為局部變數(localvariable),如果是在全局域中聲明,則為全局 ...
  • 現在學前端的人是越來越多,學習質量也是參差不齊。過來人的身份告訴你,如果你還沒有下定決心花時間去學習Web前端,那也可以先找些視頻學習下,Web前端開發有哪些常見技術點!接下來,就看看Web前端開發有哪些常見技術點! 1、你有哪些性能優化的方法? (1)減少http請求次數:CSSSprites,J ...
  • 實際應用中,目標字元串的生成可能需要多個數據的拼接。 由於應用頻繁,幾乎是所有編程語言都必須掌握的操作,當然每種語言具有各自特點。 本文將通過代碼實例詳細介紹一下JavaScript如何實現字元串拼接操作。 一.使用加號()拼接: 加號不但可以實現算數運算,也可以實現字元串拼接操作。 代碼實例如下: ...
  • 1 .window.onload //表示頁麵包含圖片等文件在內的所有元素都載入完成。 2 document.ready //函數只需對 DOM 樹的等待,而無需對圖像或外部資源載入的等待,從而執行起來更快。 3 document.onreadystatechange //當頁面載入狀態改變的時候執 ...
  • Vue.js 入門:從零開始做一個極簡 To Do 應用 寫作時間:2019 12 10版本信息:Vue.js 2.6.10官網文檔: "https://cn.vuejs.org/" 前言 學習 Vue 的最佳方式之一是「請立刻查閱 Vue.js 的 "官方文檔" 」,簡單看一下「基礎」部分,配合本 ...
  • CISC的英文全稱為“Complex Instruction Set Computer”,即“複雜指令系統電腦”,從電腦誕生以來,人們一直沿用CISC指令集方式。早期的桌面軟體是按CISC設計的,並一直沿續到現在。目前,桌面電腦流行的x86體繫結構即使用CISC。微處理器(CPU)廠商一直在走 ...
  • 微服務是當下最流行的應用架構技術了,它跟容器服務、DevOps合稱雲時代的三劍客,可以幫我們化解業務發展過快導致的產品迭代壓力,讓我們可以自由選擇最適合團隊的技術棧,讓系統能夠承載互聯網海量用戶的訪問,讓我們可以更加輕鬆地運維大型的互聯網系統。近些年在廠商、社區和用戶等各方努力推動下,微服務相關的理... ...
  • 一、手動拋出異常1.自定義無效名字異常: (1)編譯時異常,直接繼承Exception (2)運行時異常,直接繼承RuntimeException 舉例子:註意點:throws會向上拋出異常,跑到最上面的話,也就是到了main主方法了,就不要再拋了,使用try...catch....列印出來吧,當然 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...