動態規劃做多了以后,總結的相關知識

動態規劃 Dynamic Programming DP

?

準則

動態規劃的本質,是對問題狀態的定義和狀態轉移方程的定義。

動態規劃是通過拆分問題,定義問題狀態和狀態之間的關系,使得問題能夠以遞推(或者說分治)的方式去解決。

如何拆分問題,才是動態規劃的核心。

而拆分問題,靠的就是狀態的定義和狀態轉移方程的定義。

?

以LIS為例,重新定義這個問題:

給定一個數列,長度為N,

設F_{k}為:以數列中第k項結尾的最長上升子序列的長度.

求F_{1}..F_{N} 中的最大值.

對于F_{k}來講,F_{1} .. F_{k-1}都是F_{k}的子問題:因為以第k項結尾的最長遞增子序列(下稱LIS),包含著以第1..k-1中某項結尾的LIS。

?

上述的新問題F_{k}也可以叫做狀態,定義中的“F_{k}為數列中第k項結尾的LIS的長度”,就叫做對狀態的定義。

之所以把F_{k}做“狀態”而不是“問題” ,一是因為避免跟原問題中“問題”混淆,二是因為這個新問題是數學化定義的。

?

上述狀態定義好之后,狀態和狀態之間的關系式,就叫做狀態轉移方程。

比如,對于LIS問題,狀態轉移方程為:

以第k項結尾的LIS的長度是:保證第i項比第k項小的情況下,以第i項結尾的LIS長度加一的最大值,取遍i的所有值(i小于k)。

?

a. “緩存”,“重疊子問題”,“記憶化”

這三個名詞,都是在闡述遞推式求解的技巧。以Fibonacci數列為例,計算第100項的時候,需要計算第99項和98項;在計算第101項的時候,需要第100項和第99項,這時候你還需要重新計算第99項嗎?不需要,你只需要在第一次計算的時候把它記下來就可以了。上述的需要再次計算的“第99項”,就叫“重疊子問題”。如果沒有計算過,就按照遞推式計算,如果計算過,直接使用,就像“緩存”一樣,這種方法,叫做“記憶化”,這是遞推式求解的技巧。這種技巧,通俗的說叫“花費空間來節省時間”。都不是動態規劃的本質,不是動態規劃的核心。

b. “自上而下”,“自下而上”

“遞歸”:遞歸是遞推式求解的方法,連技巧都算不上。

怎么實現dp?答:兩種常用的方法。(僅僅涉及一般問題)?????

?1. 自下而上:通過正向的loop,求出所有狀態對應的值,然后找出max或者min。???????????? 優缺點:速度慢,但是相對節省空間。?????

2. 自上而下:通過遞歸的方法,需要求解f(x),則必須知道f(y),要知道f(y),必須求f(z).??????????? 優缺點:速度快,只用算需要的值,但是要調用堆棧,浪費空間。

?

c. "無后效性",“最優子結構”

上述的狀態轉移方程中,等式右邊不會用到下標大于左邊i或者k的值,這是"無后效性"的通俗上的數學定義,符合這種定義的狀態定義,我們可以說它具有“最優子結構”的性質,在動態規劃中我們要做的,就是找到這種“最優子結構”。

每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到

這個性質叫做最優子結構;

而不管之前這個狀態是如何得到的

這個性質叫做無后效性。

在對狀態和狀態轉移方程的定義過程中,滿足“最優子結構”是一個隱含的條件(否則根本定義不出來)。

d. 關于復雜度的分析

時間復雜度O (狀態數 * 每個狀態下所對應的決策數)。

空間復雜度O (狀態數)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444578.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(十三) 深入淺出TCPIP之TCP套接字參數

專欄其他文章: 理論篇: (一)深入淺出TCPIP之理解TCP報文格式和交互流程 (二)深入淺出TCPIP之再識TCP,理解TCP三次握手(上) (三)深入淺出TCPIP之再識TCP,理解…

(七)深入淺出TCPIP之深入淺出TCPIP之TCP重傳機制

目錄 TCP重傳機制 超時重傳機制 快速重傳機制 專欄其他文章: 理論篇: (一)深入淺出TCPIP之理解TCP報文格式和交互流程 (二)深入淺出TCPIP之再識TCP,理解TCP三次握手(上) (三)深入淺出TCPIP之再識TCP,理解TCP四次揮手(上&#x

那些年,我們信了課本里的那些鬼話

教材永遠都是有錯誤的,從小學到大學,我們不斷的學習了很多錯誤知識。 斑羚飛渡 在我們學習的很多小學課文里,有很多是錯誤文章,或者說是假課文。像《斑羚飛渡》: 隨著鐮刀頭羊的那聲吼叫,整個斑羚群迅速分…

(十一)深入淺出TCPIP之TCP粘包問題

目錄 粘包和拆包問題 保護消息邊界和流 粘包、拆包場景 為什么會發生TCP粘包、拆包呢?

Linux必懂知識大總結(上)

CPU top top:查看每個進程的情況 在top模式下,輸入1:查看每個CPU的性能數據,注意觀察是否有CPU100%占用率 CPU參數含義: 1)us過高表示Java應用程序消耗了大量CPU,需要定位是哪一個線程&#x…

(十六)深入淺出TCPIP之Hello CDN

專欄其他文章 理論篇: (一)深入淺出TCPIP之理解TCP報文格式和交互流程 (二)深入淺出TCPIP之再識TCP,理解TCP三次握手(上) (三)深入淺出TCPIP之再識TCP,理解TCP四次揮手(上) (四)深入淺出TCPIP之TCP三次握手和四次揮手(下)的抓包分析 (五)深入淺出TCPIP之TCP流…

(十五)非常全面的TCPIP面試寶典-進入大廠必備總結

專欄其他文章 理論篇: (一)深入淺出TCPIP之理解TCP報文格式和交互流程 (二)深入淺出TCPIP之再識TCP,理解TCP三次握手(上) (三)深入淺出TCPIP之再識TCP,理解TCP四次揮手(上) (四)深入淺出TCPIP之TCP三次握手和四次揮手(下)的抓包分析 (五)深入淺出TCPIP之TCP流量…

Linux必懂知識大總結(下)

AWK/SED awk awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行…

深入淺出TCPIP之實戰篇—用c++開發一個http服務器(二十一)

專欄其他文章: 理論篇: (一)深入淺出TCPIP之理解TCP報文格式和交互流程 (二)深入淺出TCPIP之再識TCP,理解TCP三次握手(上) (三)深入淺出TCPIP之再識TCP,理解TCP四次揮手(上) (四)深入淺出TCPIP之TCP三次握手和四次揮手(下)的抓包分析 (五)深入淺出TCPIP之TCP流…

ncnn網絡框架使用指南

下面以在ncnn上實現caffe網絡模型為例,和大家分享下ncnn這個牛叉的網絡框架的使用指南。 準備caffe網絡和模型 caffe 的網絡和模型通常是搞深度學習的研究者訓練出來的,一般來說訓練完會有 train.prototxt deploy.prototxt snapshot_10000.caffemodel 部署的時候只需要 T…

Linux必懂知識大總結(補)

關機 1. 數據同步寫入磁盤 sync 為了加快對磁盤上文件的讀寫速度,位于內存中的文件數據不會立即同步到磁盤上,因此關機之前需要先進行 sync 同步操作。 2. shutdown # /sbin/shutdown [-krhc] [時間] [警告訊息] -k : 不會關機&#xff…

(十八)深入淺出TCPIP之HTTP和HTTPS

專欄其他文章: 理論篇: (一)深入淺出TCPIP之理解TCP報文格式和交互流程 (二)深入淺出TCPIP之再識TCP,理解TCP三次握手(上) (三)深入淺出TCPIP之再識TCP,理解TCP四次揮手(上) (四)深入淺出TCPIP之TCP三次握手和四次揮手(下)的抓包分析 (五)深入淺出TCPIP之TCP流…

leetcode118. 楊輝三角

給定一個非負整數 numRows,生成楊輝三角的前 numRows 行。 在楊輝三角中,每個數是它左上方和右上方的數的和。 示例: 輸入: 5 輸出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 思路:沒什么可說的,依次…

抖音快手小視頻推薦算法之--協同過濾算法剖析

有人說抖音摧毀了中國的年輕人,也有人說抖音改變了自己的生活形態,還有人說抖音讓自己的生活過的更加有意義……一千個人眼中,有一千個哈姆雷特,各人有各個行使自己話語的權力,我們無從爭辯。 對于做自媒體的同仁們來說抖音就是粉絲變現的另外一個渠道,那抖音具體的算法…

如何抓住QQ小游戲買量紅利:休閑與內購小游戲買量優化方法分享

2019年5月,Qzone小游戲、玩一玩整合升級為全新QQ小游戲平臺,其以開放的社交生態和關系鏈,為開發者帶來了巨大的流量紅利。 為了幫助更多開發者適應和了解新市場。本文將介紹QQ小游戲投放規模現狀以及各項扶持政策,并解讀輕度小游…

(一)容器從入門到深入-容器和鏡像

一、容器與鏡像 什么是容器? 在介紹容器的具體概念之前,先簡單回顧一下操作系統是如何管理進程的。 首先,當我們登錄到操作系統之后,可以通過 ps 等操作看到各式各樣的進程,這些進程包括系統自帶的服務和用戶的應用…

leetcode461. 漢明距離

兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。 給出兩個整數 x 和 y&#xff0c;計算它們之間的漢明距離。 注意&#xff1a; 0 ≤ x, y < 231. 示例: 輸入: x 1, y 4 輸出: 2 解釋: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的箭…

(二)容器從入門到深入-初識Kubernetes

Kubernetes 是什么 Kubernetes 脫胎于 Google 的 Borg 系統&#xff0c;是一個功能強大的容器編排系統。Kubernetes 及其整個生態系統&#xff08;工具、模塊、插件等&#xff09;均使用 Go 語言編寫&#xff0c;從而構成一套面向 API、可高速運行的程序集合&#xff0c;這些程…

記一次海外大型SLG游戲服務器進程被OOM的修復經歷

事情經過 最近剛接手一個多次獲得海外GooglePlay推薦的SLG的游戲項目,服務器是java的netty框架寫的,客戶端是cocos lua。 好吧既然服務器進程運行在jvm之上,吃內存倒是挺厲害的,我一個16G內存的服務器被吃的滿滿的,這個時候為了解決內存不足,我開啟了4G的虛擬內存,方法…

leetcode50. Pow(x, n)

實現 pow(x, n) &#xff0c;即計算 x 的 n 次冪函數。 示例 1: 輸入: 2.00000, 10 輸出: 1024.00000 示例 2: 輸入: 2.10000, 3 輸出: 9.26100 示例 3: 輸入: 2.00000, -2 輸出: 0.25000 解釋: 2-2 1/22 1/4 0.25 說明: -100.0 < x < 100.0 n 是 32 位有符號整數…