日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

『ACM-算法-动态规划』初识DP动态规划算法

發(fā)布時間:2023/12/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 『ACM-算法-动态规划』初识DP动态规划算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、多階段決策過程的最優(yōu)化問題
在現(xiàn)實(shí)生活中,有類活 動的過程,由于 它的特殊性,可將過程分成若干個互相階段。在它的每一階段都需要作出決策,從而使整個過程達(dá)到最好的活動效果。當(dāng)階段決策的選取不是任意確定的,它依賴于當(dāng)前面臨的狀態(tài),又影響以后的發(fā)展,當(dāng)段決策確定后,就組成一個決策序列,因而也就確定了整個過程的一條活動路線,這個問題看作是個前后關(guān)聯(lián)具有鏈狀結(jié)構(gòu)的 多階段過程就稱為多階段決策過程,這就稱為多階段決策問題。
多階段決策過程,是指這樣的一類特殊的活動過程,問題可以按時間順序分解互聯(lián)系的階段,在每-個階段都要作出決策,全部過程的決策是-個決策序列。

二、能采用動態(tài)規(guī)劃求解的問題的一般要具有3個性質(zhì):
最優(yōu)化原理:如果問題的最優(yōu)解所包含的子問題的解也是最優(yōu)的,就稱該問題具有最優(yōu)子結(jié)構(gòu),即滿足最優(yōu)化原理。
無后效性:即某階段狀態(tài)一旦確定,就不受這個狀態(tài)以后決策的影響。也就是說,某狀態(tài)以后的過程不會影響以前的狀態(tài),只 與當(dāng)前狀態(tài)有關(guān)。
有重疊子問題:即子問題之間是不獨(dú)立的,一個子問題在下一階段決策中可能被多次使用到。(該性質(zhì)并不是動態(tài)規(guī)劃適用的必要條件,但是如果沒有這條性質(zhì),動態(tài)規(guī)劃算法同其他算法相比就不具備優(yōu)勢)

三、動態(tài)規(guī)劃基本概念
狀態(tài):描述事物的性質(zhì),不同事物有不同的性質(zhì),因而用不同的狀態(tài)來刻畫。對問題的求解狀態(tài)的描述是分階段的。
決策:根據(jù)題意要求,對每個階段所做出的某種選擇性操作。
狀態(tài)轉(zhuǎn)移方程:用數(shù)學(xué)公式描述與階段相關(guān)的狀態(tài)間的演變規(guī)律。
四、解題步驟:

  • 拆分問題
  • 定義狀態(tài)(并找出初狀態(tài))
  • 狀態(tài)轉(zhuǎn)移方程
  • 五、模型方法
    第一種遞歸搜索法。
    第二種遞歸搜索法+記憶。
    第三種遞推式法。

    六、例題
    數(shù)塔問題

    思路分析:
    貪心不可解,每一步都會影響后續(xù)的操作。
    在用動態(tài)規(guī)劃考慮數(shù)塔問題時可以自頂向下的分析,自底向上的計(jì)算。
    從頂點(diǎn)出發(fā)時到底向左走還是向右走應(yīng)取決于是從左走能取到最大值還是從右走能取到最大值,只要左右兩道路徑上的最大值求出來了才能作出決策。同樣的道理下一層的走向又要取決于再下一層上的最大值是否已經(jīng)求出才能決策。這樣一層一層推下去,直到倒數(shù)第二層時就非常明了。
    所以第一步對第五層的8個數(shù)據(jù),做如下四次決策:
    如果經(jīng)過第四層2,則在第五層的19和7中肯定是19;
    如果經(jīng)過第四層18,則在第五層的7和10中肯定是10;
    如果經(jīng)過第四層9,則在第五層的10和4中肯定是10;
    如果經(jīng)過第四層5,則在第五層的4和16中肯定是16;
    經(jīng)過一次決策,問題降了一階。5層數(shù)塔問題轉(zhuǎn)換成4層數(shù)塔問題,如此循環(huán)決策…… 最后得到1階的數(shù)塔問題。

    #include <bits/stdc++.h using namespace std; const int MAXN = 100+10; int num[MAXN][MAXN]; int dp[MAXN][MAXN]; int main() {int t;scanf("%d", &t);while( t-- ){memset(dp, 0, sizeof(dp));int n;scanf("%d", &n);for( int i=1; i<=n; i++ ){for( int j=1; j<=i; j++ )scanf("%d", &num[i][j]);}for( int j=1; j<=n; j++ )dp[n][j] = num[n][j];for( int i = n-1; i = 1; i-- ){for( int j=1; j <= i; j++ ){dp[i][j] = num[i][j] + max(dp[i+1][j], dp[i+1][j+1]);}}printf("%d\n", dp[1][1] );}return 0; }

    1.以上篇文章數(shù)塔為例

    上一章用的是遞歸的做法,這次我們采用遞推的做法。

    遞歸:從已知問題的結(jié)果出發(fā),用迭代表達(dá)式逐步推算出問題的開始的條件,即順推法的逆過程,稱為遞歸。
    遞推:遞推算法是一種用若干步可重復(fù)運(yùn)算來描述復(fù)雜問題的方法。遞推是序列計(jì)算中的一種常用算法。通常是通過計(jì)算機(jī)前面的一些項(xiàng)來得出序列中的指定象的值。
    遞歸與遞推區(qū)別:相對于遞歸算法,遞推算法免除了數(shù)據(jù)進(jìn)出棧的過程,也就是說,不需要函數(shù)不斷的向邊界值靠攏,而直接從邊界出發(fā),直到求出函數(shù)值。
    斐波那契數(shù)列:已知f(1) = 1 , f(2) = 1 , 且滿足關(guān)系式f(n) = f(n-1) + f(n-2),則f(50)等于多少?
    分析:根據(jù)初始條件f(1) = 1 , f(2) = 1 和關(guān)系式f(n) = f(n-1) + f(n-2),可知,f(3) = f(2) + f(1) , f(3) = f(2) + f(1) …….
    編寫代碼(遞歸)

    第四層的取值等于左下或者右下與自己的加和,第四層就有max{2+19,2+7} max{18+7,18+10} max{9+10,9+4} max{5+4,5+16}
    結(jié)果第四層就變成了 21,28,19,21。這樣五層變成了四層。以此類推n層變?yōu)閚-1層到1層。更易求出最大值。
    代碼實(shí)現(xiàn)過程如下

    #include<bits/stdc++.h using namespace std; int main {int ob[10][10];int temp;cinN;//數(shù)塔層數(shù)for(int i=0;i<N;i++){for(t=0;t<=i;t++){cina[i][j];}}for(int i=N-1;i=1;i--){for(int t=0;t<=i;t++){temp=max{a[i+1][t],a[i+1][t+1];a[i][t]=a[i][t]+temp;}}1、線性模型線性模型的是動態(tài)規(guī)劃中最常用的模型,上文講到的最長單調(diào)子序列就是經(jīng)典的線性模型,這里的線性指的是狀態(tài)的排布是性的。2、區(qū)間模型區(qū)間模型的狀態(tài)表示一般為d[i][j],表示區(qū)間[i, j]上的最優(yōu)解,然后通過狀態(tài)轉(zhuǎn)移計(jì)算出[i+1, j]或者[i, j+1]上的最優(yōu)解,逐步擴(kuò)大區(qū)間的范圍,最終求得[1, len]的最優(yōu)解。

    3、背包模型
    背包問題是動態(tài)規(guī)劃中一個最典型的問題之一。由于網(wǎng)上有非常詳盡的背包講解,這里只將常用部分抽出來,具體推導(dǎo)過程詳見 《背包九講》。
    a.0/1背包
    有N種物品(每種物品1件)和一個容量為V的背包。放入第 i 種物品耗費(fèi)的空間是Ci,得到 的價值是Wi。求解將哪些物品裝入背包可使價值總和最大。
    f[i][v]表示前i種物品恰好放入一個容量為v的背包可以獲得的最大價值。
    決策為第i個物品在前i-1個物品放置完畢后,是選擇放還是不放,狀態(tài)轉(zhuǎn)移方程為:
    f[i][v] = max{ f[i-1][v], f[i-1][v - Ci] +Wi }
    時間復(fù)雜度O(VN),空間復(fù)雜度O(VN) (空間復(fù)雜度可利用滾動數(shù)組進(jìn)行優(yōu)化達(dá)到O(V),下文會介紹滾動數(shù)組優(yōu)化)。

    b.完全背包有N種物品(每種物品無限件)和一個容量為V的背包。放入第 i 種物品耗費(fèi)的空間是Ci,得到 的價值是Wi。求解將哪些物品裝入背包可使價值總和最大。f[i][v]表示前i種物品恰好放入一個容量為v的背包可以獲得的最大價值。f[i][v] = max{ f[i-1][v - kCi] + kWi | 0 <= k <= v/Ci } (當(dāng)k的取值為0,1時,這就是01背包的狀態(tài)轉(zhuǎn)移方程)時間復(fù)雜度O( VNsum{V/Ci} ),空間復(fù)雜度在用滾動數(shù)組優(yōu)化后可以達(dá)到 O( V )。進(jìn)行優(yōu)化后(此處省略500字),狀態(tài)轉(zhuǎn)移方程變成:f[i][v] = max{ f[i-1][v], f[i][v - Ci] +Wi } 時間復(fù)雜度降為 O(VN)。c.多重背包有N種物品(每種物品Mi件)和一個容量為V的背包。放入第i種物品耗費(fèi)的空間是Ci,得到 的價值是Wi。求解將哪些物品裝入背包可使價值總和最大。f[i][v]表示前i種物品恰好放入一個容量為v的背包可以獲得的最大價值。f[i][v] = max{ f[i-1][v - kCi] + kWi | 0 <= k <= Mi }時間復(fù)雜度O( Vsum(Mi) ), 空間復(fù)雜度仍然可以用滾動數(shù)組優(yōu)化后可以達(dá)到 O( V )。優(yōu)化:采用二進(jìn)制拆分物品,將Mi個物品拆分成容量為1、2、4、8、... 2^k、Mi-( 2^(k+1) - 1 ) 個對應(yīng)價值為Wi、2Wi、4Wi、8Wi、...、2^kWi、( Mi-( 2^(k+1) - 1 )

    )Wi的物品,然后采用01背包求解。 這樣做的時間復(fù)雜度降為O(Vsum(logMi) )。找不到出處了

    給定一個字符串s,你可以從中刪除一些字符,使得剩下的串是一個回文串。如何刪除才能使得回文串最長呢? 輸出需要刪除的字符個數(shù)。

    本題可轉(zhuǎn)化為動態(tài)規(guī)劃算法求解最長公共子序列問題,然后用總字符串長度減去最長子序列長度,便得出問題的答案。

    先將給定的初始字符串S1反過來排列,設(shè)為S2,求S1和S2的最長公共子序列便可。C++代碼如下:

    #include <iostream #include <string #include <algorithm using namespace std; int temp[100][100];void caculate(string s1){string s2(s1);reverse(s2.begin(), s2.end());int len = s1.length();memset(temp, 0, sizeof(temp));for (int i = 0; i<len; ++i){for (int j = 0; j<len; ++j){if (s1[i] == s2[j])temp[i + 1][j + 1] = temp[i][j] + 1;else temp[i + 1][j + 1] = max(temp[i][j + 1], temp[i + 1][j]);}}cout << len - temp[len][len] << endl; }int main() {string s;getline(cin, s);caculate(s);system("pause");return 0; }

    相關(guān)題目:

    簡單基礎(chǔ)dp

    hdu 2084 數(shù)塔 簡單從上往下遞推

    hdu 2018 母牛的故事 簡單遞推計(jì)數(shù)

    hdu 2044 一只小蜜蜂… 簡單遞推計(jì)數(shù)(Fibonacci)

    hdu 2041 超級樓梯 Fibonacci

    hdu 2050 折線分割平面 找遞推公式

    CF 429B B.Working out 四個角遞推

    zoj 3747 Attack on Titans 帶限制條件的計(jì)數(shù)遞推dp

    uva 10328 Coin Toss 同上題

    hdu 4747 Mex

    hdu 4489 The King’s Ups and Downs

    hdu 4054 Number String

    背包

    hdu 2955 Robberies 01背包

    hdu 1864 最大報銷額 01背包

    hdu 2602 Bone Collector 01背包

    hdu 2844 Coins 多重背包

    hdu 2159 FATE 完全背包

    woj 1537 A Stone-I 轉(zhuǎn)化成背包

    woj 1538 B Stone-II 轉(zhuǎn)化成背包

    poj 1170 Shopping Offers 狀壓+背包

    zoj 3769 Diablo III 帶限制條件的背包

    zoj 3638 Fruit Ninja 背包的轉(zhuǎn)化成組合數(shù)學(xué)

    hdu 3092 Least common multiple 轉(zhuǎn)化成完全背包問題

    poj 1015 Jury Compromise 擴(kuò)大區(qū)間+輸出路徑

    poj 1112 Team Them UP 圖論+背包

    LIS

    hdu 1003 Max Sum

    hdu 1087 Super Jumping!

    uva 10635 Prince and Princess LCS轉(zhuǎn)化成LIS

    hdu 4352 XHXJ’s LIS 數(shù)位dp+LIS思想

    srm div2 1000 狀態(tài)壓縮+LIS

    poj 1239 Increasing Sequence 兩次dp

    LCS

    hdu 1503 Advanced Fruits

    hdu 1159 Common Subsequence

    uva 111 History Grading

    poj 1080 Human Gene Functions

    區(qū)間dp

    poj 1141 Brackets Sequence 括號匹配并輸出方案

    hdu 4745 Two Rabbits 轉(zhuǎn)化成求回文串

    zoj 3541 The Last Puzzle 貪心+區(qū)間dp

    poj 2955 Brackets

    hdu 4283 You Are the One 常見寫法

    hdu 2476 String Printer

    zoj 3537 Cake

    CF 149D Coloring Brackets

    zoj 3469 Food Delivery

    樹形dp

    hdu 4123 Bob’s Race 二分+樹形dp+單調(diào)隊(duì)列

    hdu 4514 求樹的直徑

    poj 1655 Balancing Act

    hdu 4714 Tree2Cycle 思維

    hdu 4616 Game

    hdu 4126 Genghis Kehan the Conqueror MST+樹形dp 比較經(jīng)典

    hdu 4756 Install Air Conditioning MST+樹形dp 同上

    hdu 3660 Alice and Bob’s Trip 有點(diǎn)像對抗搜索

    CF 337D Book of Evil 樹直徑的思想 思維

    hdu 2196 Computer 搜兩遍

    數(shù)位dp

    hdu 2089 不要62 簡單數(shù)位dp

    hdu 3709 Balanced Number 比較簡單

    CF 401D Roman and Numbers 狀壓+數(shù)位dp

    hdu 4398 X mod f(x) 把模數(shù)加進(jìn)狀態(tài)里面

    hdu 4734 F(x) 簡單數(shù)位dp

    hdu 3693 Math teacher’s homework 思維變換的數(shù)位dp

    hdu 4352 XHXJ’s LIS 數(shù)位dp+LIS思想

    CF 55D Beautiful Numbers 比較巧妙的數(shù)位dp

    hdu 3565 Bi-peak Numbers 比較難想

    CF 258B Little Elephant and Elections 數(shù)位dp+組合數(shù)學(xué)+逆元

    概率(期望) dp

    ural 1776 Anniversiry Firework 比較基礎(chǔ)

    hdu 4418 Time travel 比較經(jīng)典BFS+概率dp+高斯消元

    hdu 4586 Play the Dice 推公式比較水

    hdu 4487 Maximum Random Walk

    jobdu 1546 迷宮問題 高斯消元+概率dp+BFS預(yù)處理

    hdu 3853 LOOPS 簡單概率dp

    hdu 4405 Aeroplane chess 簡單概率dp,比較直接

    hdu 4089 Activation 比較經(jīng)典

    poj 2096 Collecting Bugs 題目比較難讀懂

    zoj 3640 Help me Escape 從后往前,比較簡單

    hdu 4034 Maze 經(jīng)典好題,借助樹的概率dp

    hdu 4336 Card Collector 狀態(tài)壓縮+概率dp

    hdu 4326 Game 這個題狀態(tài)有點(diǎn)難抽象

    狀態(tài)壓縮dp

    這類問題有TSP、插頭dp(輪廓線DP)等。
    hdu 1693 Eat the Trees 插頭dp

    hdu 4568 Hunter 最短路+TSP

    hdu 4539 插頭dp

    hdu 4529 狀壓dp

    poj 1185 炮兵陣地

    poj 2411 Mandriann’s Dream 輪廓線dp

    hdu 3811 Permutation

    poj 1038

    poj 2441

    hdu 2167

    hdu 4026

    hdu 4281

    總結(jié)

    以上是生活随笔為你收集整理的『ACM-算法-动态规划』初识DP动态规划算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。