主頁 >  其他 > 分享經典的動態規劃問題(一)

分享經典的動態規劃問題(一)

2020-09-15 14:54:56 其他

摘要:延續首題優良傳統進一步探討和訓練一下動規的基本套路.

1.正文:其實,動態規劃作為運籌學的一個分支,經過前輩的理論沉淀,已經形成一套科學可行的解決思路,在實踐中借用前輩的智慧,結合實際問題我可以總結我在解決動規程序中常有的實作套路:

  (1)題意分析;

  (2)基于分析數學建模;

  (3)判定是否可以符合使用動規的兩大前置條件(最優子結構和無后效性),是則下一步,否則終止(非動規可以解決的問題,另尋他法);

  (4)動規基本三步曲:

    1)結合題意根據模型選擇計算出比較合適的狀態轉移方程,歸約初始的狀態值,推匯出終止(最終收斂)條件;

    2)迭代驗證;

    3)選擇合適的迭代次序實作狀態轉移方程的迭代和收斂;

  (5)編程實作,

  對待常規的動規問題,這樣的做法足矣,雖然沒有理論上那么嚴謹,表現在沒有過多的校驗或者數學推演,但須知我們本來就是為了解決現實問題而非理論問題,所以在面向工業實踐上的問題來看這樣的套路基本屬于嚴謹的范疇了,以下我逐步說明一下為何要做這樣的步驟:

  步驟(1):題意分析是大前提,如果這一步都做錯了,映射到解決業務需求的現實作業模型中你就是沒有跟產品對齊需求,理解錯了需求了,這樣做出來的產品還會有業務價值嗎?

  步驟(2):基于分析來建立數學模型,一是確保分析過后的正確理解作為建立數學模型的輸入引數,這樣一環扣一環,才會確保問題解決的正確性;二是必然,所有資訊化相關的實際問題終究是歸結于數學模型的建立,資訊的輸入輸出模型本質上就是可以映射成數學中自變數與因變數的函式變換,當然還有諸多特質注定它可以被數學建模解決,如果不分析你很難建模;如果不建模,你很難理解該如何推匯出合適狀態轉移方程,所以這一步是銜接;

  步驟(3):但凡想用任何一種技巧或方法去解決某類問題,都先校驗清楚該技巧或方法的適用范圍(無論是本次討論的動態規劃還是以后二分查找、分治法等等方法)是否符合題意場景,不然即便做出來也不能確保它的正確性;

  步驟(4):按著這三步曲走只是博主總結的個人實體,如上有問題,還請多多指教!

      1)即便是一道題適用動態規劃,他也可以有種形式的狀態轉移方程(后面會討論),至于什么是合適的,除了具體問題具體分析外,還有結合方程是否可以轉化為方便編程實作的要素考慮;

      2)驗證就不多說了,好比測驗驅動開發中的測驗步驟,必不可少的驗證其正確性的步驟,

      3)至于選擇合適的迭代次序,博主踩過坑,有一次推匯出一個個性化的動規轉移方程上是需要按列逆向遍歷的二重遍歷,但沒理解到位,按常規的行正向遍歷次序去遍歷動規的存盤陣列,導致了迭代產生的資料都是不對的,通過除錯才發現,所以迭代計算的順序也是需要關注的,另外,確保動規的狀態轉移方程是可以收斂的,程式才不會死回圈,可收斂表現在可以根據引數推匯出迭代終止條件的,

  步驟(5)不再贅述,關鍵在于組織好代碼即可,

  不多說,看看今日有趣的例題,

2.題目:

某蛋糕店推出一種禮品卡,使用該卡可以用于購買店內的蛋糕,
每種蛋糕限購1個,
該卡片面值為R元,僅可以使用1次,結賬后卡內剩下的余額作廢,
已知店內的全部種類的蛋糕價格都為整數,
求出怎么購買,可使結賬后卡內剩下的余額最少?

3.輸入輸出示例:

輸入:

1)所有蛋糕的價值:
  2, 3, 5, 11, 6
2)面值R:
  15

輸出最少的余額:  

  1

4.例程: 

public class Asolution {

/**
某蛋糕店推出一種禮品卡,使用該卡可以用于購買店內的蛋糕,
每種蛋糕限購1個,
該卡片面值為R元,僅可以使用1次,結賬后卡內剩下的余額作廢,
已知店內的全部種類的蛋糕價格都為整數,
求出怎么購買,可使結賬后卡內剩下的余額最少
*/
/**
* F[i][j]表示用j元面額買[0 .. i]內的蛋糕的最大金額
* F[i][j] = max{F[i - 1][j - a[i]] + a[i] , F[i - 1][j]}
*/

private static int getMaxValues(int[] prices, int r) {
int[][] maxs = new int[prices.length][r + 1];
int max = 0;
for (int j = 0; j <= r; j++) {
if (j >= prices[0]) {
maxs[0][j] = prices[0];
        }
}
for (int i = 1; i < maxs.length; i++) {
for (int j = 0; j <= r; j++) {
maxs[i][j] = maxs[i - 1][j];
if (j >= prices[i]) {
maxs[i][j] = Math.max(maxs[i][j] , maxs[i - 1][j - prices[i]] + prices[i]);
          }
if (max < maxs[i][j]) {
max = maxs[i][j];
          }
}
}
return max;
}

public static void main(String[] strings) {
int[] prices = {2, 3, 5, 11, 6};
    System.out.println(15 - getMaxValues(prices , 15));
  }
}


現在按上述我自行總結的套路捋一遍:


該題比較淺顯,算是出題人已經幫你建好模了,不需要再抽象出來數學模型(變數都直接標注在題干里),
1.基于分析建模:問題最明顯:剩下余額最少,面值R固定,花費才是主動發生變化的變數,故我們可以轉化問題為求最大花費,即一個最優化問題,
1)它的未來狀態不會影響過去狀態(你將來花了多少錢都不會影響你過去實際已經花掉的最大值(是過去已經花掉的,不包含當前選擇花費多少的動態考慮)),無后效;
2)在子范圍內(n - 1個蛋糕)解決類似的問題得到的答案可以用于父范圍(n個蛋糕),屬于最優子結構,

2.三步走:
1) 顯然,狀態轉移方程很容易可以得出,分類討論一下即可:

  (1)買了價值a[i]的蛋糕則:F[i - 1][j - a[i]] + a[i];

  (2)不買價值a[i]的蛋糕則:F[i - 1][j]

  兩者比較最大者勝出,這就”打擂臺“得到了最大花費了,

  * F[i][j]表示用j元面額買[0 .. i]內的蛋糕的最大金額
  * F[i][j] = max{F[i - 1][j - a[i]] + a[i] , F[i - 1][j]}

  顯然,初始值F[0][j] =a[0],終止條件是遍歷完成;

  2)驗證:舉例如:求F[1][15],此時i=1,j=15

    F[i - 1][j - a[i]] + a[i] = F[0][15 - 3] + 3 = a[0] + 3 = 5

    F[i - 1][j] = F[0][15] = 2;

  所以顯然是對的,當然還可以再驗證多幾個,不再贅述,

  3)這里只要捋清楚遍歷次序就是了,因為初始值比較常規,就是首行,正向行遍歷即可,

5.總結:

 1.雖然只是簡單的一道線性動規,但是捋清楚整個套路下來,我們就很容易聚焦到重點難點上:1)對于未曾建模的題型(后面會遇到),建模將會是難點,因為它是現實模型到數理模型的一個映射,焦點抓得好,建模才有效果;2)推導選擇出合適的狀態轉移方程,無他,唯訓練爾,當然,數學知識將會是很大的幫助,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/47550.html

標籤:其他

上一篇:tarjan演算法 求割點

下一篇:leetcode1122之陣列的相對排序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more