贪心算法数塔问题c语言,c语言背包问题_c语言背包问题几种解法_背包问题贪心算法(2)...
(3).動態規劃(Dynamic Programming,以下簡稱DP)
俗話說,要看一個人的算法水平,只要看一下他做DP題的水平就OK了,而在ACM這個多變的賽場上,幾多算法沉浮,唯有DP幾乎從未消失過,如果你問我什么類型的題在賽場上出現的概率最高,我可以毫不猶豫地告訴你,是DP。由此也可以看出,DP的地位有多么重要,那么這樣一個幾乎每場比賽都會出現的題型,應該很難啊,為什么要讓我們從DP入手呢?確實,DP是很難,其變型之多,覆蓋知識面之廣,確實讓人望而生卻,但是,我想說下如何入門DP題。首先是DP幾個最為基本的模型,LCS(最長公共子序列),LIS(最長上升子序列),最大公共子段和,數塔問題,矩陣連乘等幾個最為經典的問題,大家一開始的時候可能難以理解DP中自底向上,重疊子結構等基本思想,對于這幾道問題可以先看一下別人的代碼和書上的講解,然后再自己反復地理解,理解了之后再自己敲一下代碼,如果有地方實在不理解,可以先放一下,去看看其他題,回過頭來再想一下以前的題,也許會有豁然開朗的效果。吃透了DP的幾個經典問題之后,就可以做一下這些經典問題的變型了,比如最大公共子段和的變型——最大子矩陣和最大m子段和,最長公共子序列和最長上升子序列的變型——最長公共上升子序列等等。并且可以嘗試接觸DP的一些重要的應用,最重要的要數背包問題,背包問題是DP一個很大的分支(算是分支吧,我找不到其他更好的詞來形容他了),同樣也有非常多的變型,如最為基礎的01背包,以及擴充出去的多重背包,完全背包,分組背包,樹型DP(這個知識點我待會會介紹)中應用非常多的泛化背包等等,下面我把最為基本01背包,多重背包和完全背包講一下,首先是最簡單的01背包,偽代碼如下:
for i=1..N
for v=V..0
f[v]=max{ f[v], f[ v-c[i] ] + w[i] }
這里為什么要倒推呢?其實道理很簡單,因為這里其實是利用類似滾動數組的概念,只不過他連2個數組都不用開了,只需要開一個數組就可以了,這是為什么呢?因為傳統的二維數組中f[i][v]的值是由max( f[i-1][v], f[i-1][ v-c[i] ] + w[i] )得來的,所以每次f[v]的值是由上層循環中fv’得來的,所以改成了一維數組后,如果從小到大循環的話,在計算完成f[v] 之后,就會在計算f[v’](v’ >=v)時發生錯誤,因為原本計算f[v’]所需的上層循環中的f[v]的值已經被新的值覆蓋掉了,故必須從大到小循環。其次是多重背包,完全可以化為01背包問題,不過是把相同價值的同種類物品看成多個價值相同的不同種類物品,即比01背包多了一重循環,要注意的是這兩層循環都要從大到小,原理和01背包類似。最后是完全背包問題,偽代碼如下:
for i=1..N
for v=0..V
f[v]=max{ f[v], f[ v-c[i] ] + w[i] }
這個偽代碼與01背包的偽代碼只有v的循環次序不同而已。為什么這樣一改就可行呢?首先想想為什么01背包中要按照v=V..0的逆序來循環。這是因為要保證第i次循環中的狀態f[i][v]是由狀態f[i-1][v-c[i]]遞推而來。換句話說,這正是為了保證每件物品只選一次,保證在考慮“選入第i件物品”這件策略時,依據的是一個絕無已經選入第i件物品的子結果f[i-1][v-c[i]]。而現在完全背包的特點恰是每種物品可選無限件,所以在考慮 “加選一件第i種物品”這種策略時,卻正需要一個可能已選入第i種物品的子結果f[i][v-c[i]],所以就可以并且必須采用v= 0..V的順序循環。這就是這個簡單的程序為何成立的道理。這里我向大家推薦一下浙江大學的DD牛所寫的《背包九講》,是背包入門及提高的最為經典的資料。現在就要講一下樹型DP了,樹型DP其實就是DP,只不過是建立在樹模型之上的DP罷了,不過樹型DP說起來雖然簡單,確是DP中相當困難的一個知識點,要好好理解,多做些題才行。最后是狀態壓縮DP,這也是一個DP的一個難點,所謂的狀態是指利用二進制或者其他進制的數來表示狀態從而達到空間上壓縮的目的,這一類的狀態設計一般都很巧妙,而且涉及的眾多位運算對于編碼能力也是一個相當大的挑戰,介于狀態壓縮DP是用記憶化搜索(所謂記憶化搜索,是DP的另外一種遞歸的實現形式,即所謂的自頂向下)來實現的,又要牽涉到搜索的知識點,建議等學習了相關的內容之后再回過來頭來學習這個知識點。狀態壓縮的經典題有棋盤覆蓋問題,炮兵陣地等。
本文來自電腦雜談,轉載請注明本文網址:
http://www.pc-fly.com/a/tongxinshuyu/article-24376-2.html
總結
以上是生活随笔為你收集整理的贪心算法数塔问题c语言,c语言背包问题_c语言背包问题几种解法_背包问题贪心算法(2)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux ll命令无效
- 下一篇: 第六十一期: 从7600万个5G连接中,