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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NOIP竞赛学习整理--动态规划算法举例P1264

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NOIP竞赛学习整理--动态规划算法举例P1264 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態規劃

什么是動態規劃?

動態規劃是解決多階段決策最優化問題的一種思想方法。所謂“動態”,指的是在問題的多階段決策中,按某一順序,根據每一步所選決策的不同,將隨即引起狀態的轉移,最終在變化的狀態中產生一個決策序列。動態規劃就是為了使產生的決策序列在符合某種條件下達到最優。

一、動態規劃中的主要概念,名詞術語

1 階段:把問題分成幾個相互聯系的有順序的幾個環節,這些環節即稱為階段。
2 狀態:某一階段的出發位置稱為狀態。通常一個階段包含若干狀態。如圖1中,階段3就有三個狀態結點4、5、6。
3 決策:從某階段的一個狀態演變到下一個階段某狀態的選擇。
4策略:由開始到終點的全過程中,由每段決策組成的決策序列稱為全過程策略,簡稱策略。
5 狀態轉移方程:前一階段的終點就是后一階段的起點,前一階段的決策選擇導出了后一階段的狀態,這種關系描述了由k階段到k+1階段狀態的演變規律,稱為狀態轉移方程。
6 目標函數與最優化概念:目標函數是衡量多階段決策過程優劣的準則。最優化概念是在一定條件下找到一個途徑,經過按題目具體性質所確定的運算以后,使全過程的總效益達到最優。

二、動態規劃問題的數學描述

首先,例舉一個典型的且很直觀的多階段決策問題:
[例] 下圖表示城市之間的交通路網,線段上的數字表示費用,單向通行由
A->E。試用動態規劃的最優化原理求出 A->E 的最省費用。

如圖從 A 到 E 共分為 4 個階段,即第一階段從 A 到 B,第二階段從 B 到 C,
第三階段從 C 到 D,第四階段從 D 到 E。除起點 A 和終點 E 外,其它各點既是上
一階段的終點又是下一階段的起點。例如從 A 到 B 的第一階段中,A 為起點,終
點有 B1,B2,B3 三個,因而這時走的路線有三個選擇,一是走到 B1,一是走到
B2,一是走到 B3。若選擇 B2 的決策,B2 就是第一階段在我們決策之下的結果,
它既是第一階段路線的終點,又是第二階段路線的始點。在第二階段,再從 B2
點出發,對于 B2 點就有一個可供選擇的終點集合(C1,C2,C3);若選擇由 B2
走至 C2 為第二階段的決策,則 C2 就是第二階段的終點,同時又是第三階段的始
點。同理遞推下去,可看到各個階段的決策不同,線路就不同。很明顯,當某階
段的起點給定時,它直接影響著后面各階段的行進路線和整個路線的長短,而后 面各階段的路線的發展不受這點以前各階段的影響。故此問題的要求是:在各個
階段選取一個恰當的決策,使由這些決策組成的一個決策序列所決定的一條路
線,其總路程最短。

三、 運用動態規劃需符合的條件

任何思想方法都有一定的局限性,超出了特定條件,它就失去了作用。同理,動態規劃也并不是萬能的。那么使用動態規劃必須符合什么條件呢?必須滿足最優化原理和無后效性。

1 最優化原理

最優化原理可這樣闡述:一個最優化策略具有這樣的性質,不論過去狀
態和決策如何,對前面的決策所形成的狀態而言,余下的諸決策必須構成最優策略。簡而言之,一個最優化策略的子策略總是最優的。

2 無后效性

“過去的步驟只能通過當前狀態影響未來的發展,當前的狀態是歷史的總結”。這條特征說明動態規劃只適用于解決當前決策與過去狀態無關的問題。狀態,出現在策略任何一個位置,它的地位相同,都可實施同樣策略,這就是無后效性的內涵。
由上可知,最優化原理,無后效性,是動態規劃必須符合的兩個條件。

四 、動態規劃的計算方法

對于一道題,怎樣具體運用動態規劃方法呢?

(1)首先,分析題意,考察此題是否滿足最優化原理與無后效性兩個條件。
(2)接著,確定題中的階段,狀態,及約束條件。
(3)推導出各階段狀態間的函數基本方程,進行計算。

應用舉例:數字三角形(洛谷-P1216)

題目描述
觀察下面的數字金字塔。

寫一個程序來查找從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。

7 3 8 8 1 0

2 7 4 4
4 5 2 6 5
在上面的樣例中,從 7 \to 3 \to 8 \to 7 \to 57→3→8→7→5 的路徑產生了最大

輸入格式
第一個行一個正整數 rr ,表示行的數目。

后面每行為這個數字金字塔特定行包含的整數。

輸出格式
單獨的一行,包含那個可能得到的最大的和。

輸入輸出樣例
輸入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
輸出
30

思路:

@順推:

F[i+1][j] = MAX (F[i][j] + a[i+1][j]);

F[i+1][j+1] = MAX (F[i][j] + a[i+1][j+1]);

@ 逆推:

F[i][j] = MAX (F[i-1][j], F[i-1][j-1]) + a[i][j]; (注意!逆推時要注意邊界情況! )

代碼如下:
1、順推:

//T2:數字金字塔-順推(有點類似于記憶化搜索的思路) //d數組儲存順序:記錄從頂端向底部走的路徑最優值(自頂向下)#include<iostream> #include<string.h> using namespace std; int a[1005][1005];//儲存數塔 int d[1005][1005];//從該點到底端的最大數字和 int main() {int i,j,n,ans;while(cin>>n){memset(d,-1,sizeof(d));for(i=0;i<n;i++)for(j=0;j<=i;j++){cin>>a[i][j];}d[0][0]=a[0][0];for(int i=0;i<n-1;++i)for(int j=0;j<=i;++j)//d數組為最優值路徑(黑色金字塔,a為源數據數組(紫色金字塔){//分別用最優值來更新左下方和右下方d[i+1][j]=max(d[i+1][j],d[i][j]+a[i+1][j]);//和當前的f[i+1][j]比較d[i+1][j+1]=max(d[i+1][j+1],d[i][j]+a[i+1][j+1]);//和當前的f[i+1][j+1]比較}//答案可能是最后一行的任意一個,所以把最后一行搜索一遍,最大的賦給ansans=0;for(int i=0;i<n;i++)ans=max(ans,d[n-1][i]);cout<<ans<<endl;for(int i=0;i<n;++i){for(int j=0;j<=i;++j){cout<<d[i][j]<<" ";}cout<<endl;}}return 0; }

2、逆推

//數字金字塔-逆推 //d數組儲存順序:記錄從頂端向底部走的路徑最優值(自頂向下) #include<iostream> #include<string.h> using namespace std; int a[1005][1005];//儲存數塔 int d[1005][1005];//從該點到底端的最大數字和 int main() {int i,j,n,ans;while(cin>>n){memset(d,-1,sizeof(d));for(i=0;i<n;i++)for(j=0;j<=i;j++){cin>>a[i][j];}//逆推(自頂向下)d[0][0]=a[0][0];for(int i=1;i<n;i++){d[i][0]=d[i-1][0]+a[i][0];//最左的位置沒有左上方d[i][i]=d[i-1][i-1]+a[i][i];//最右的位置沒有右上方for(int j=0;j<=i;j++)//在左上方和右上方取較大的d[i][j]=max(d[i-1][j-1],d[i-1][j])+a[i][j];}//答案可能是最后一行的任意一個,所以把最后一行搜索一遍,最大的賦給ansans=0;for(int i=0;i<n;i++)ans=max(ans,d[n-1][i]);cout<<ans<<endl;;for(int i=0;i<n;++i){for(int j=0;j<=i;++j){cout<<d[i][j]<<" ";}cout<<endl;}}return 0; }

附注:

動態規劃相比較于深度搜索算法是一種高效算法。若能成功運用,必會使程序效率,無論時間還是空間,都有著質的飛躍。

掌握好動態規劃,關鍵還是在于理解動態規劃算法的基礎上,多找一些相關的題進行練習。

總結

以上是生活随笔為你收集整理的NOIP竞赛学习整理--动态规划算法举例P1264的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。