樹形動態規劃

2022-08-17 09:24:23 字數 1793 閱讀 8711

問題可以分解成若干相互聯絡的階段,在每乙個階段都要做出決策,全部過程的決策是乙個決策序列。要使整個活動的總體效果達到最優的問題,稱為多階段決策問題。動態規劃就是解決多階段決策最優化問題的一種思想方法。

將所給問題的過程,按時間或空間特徵分解成若干相互聯絡的階段,以便按次序去求每階段的解

各階段開始時的客觀條件叫做狀態。

當各段的狀態取定以後,就可以做出不同的決定,從而確定下一階段的狀態,這種決定稱為決策。

由開始到終點的全過程中,由每段決策組成的決策序列稱為全過程策略,簡稱策略。

前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後一階段的狀態,這種關係描述了由k階段到k+1階段狀態的演變規律,稱為狀態轉移方程。

目標函式是衡量多階段決策過程優劣的準則。最優化概念是在一定條件下找到乙個途徑,經過按題目具體性質所確定的運算以後,使全過程的總效益達到最優。

大多數動規都是在一維二維這種規則的背景下的,可以解決的問題比較侷限,而樹作為一種特殊的圖,可以描述比較複雜的關係,再加上樹的遞迴定義,是一種非常合適動規的框架,樹型動態規劃就成為動規中很特殊的一種型別。

樹形動態規劃基本上可以分為2個部分,乙個是建樹,另乙個就是動態規劃,乙個好的資料結構,能使你程式設計非常容易,這也是樹形動態規劃的難點之一

沒有上司的晚會等

【問題描述】

有個公司要舉行一場晚會。為了讓到會的每個人不受他的直接上司約束而能玩得開心,公司領導決定:如果邀請了某個人,那麼一定不會再邀請他的直接的上司,但該人的上司的上司,上司的上司的上司……都可以邀請。已知每個人最多有唯一的乙個上司。

已知公司的每個人參加晚會都能為晚會增添一些氣氛,求乙個邀請方案,使氣氛值的和最大。

【輸入:】

第1行乙個整數n(1<=n<=6000)表示公司的人數。

接下來n行每行乙個整數。第i行的數表示第i個人的氣氛值x(-128<=x<=127)。

接下來每行兩個整數l,k。表示第k個人是第l個人的上司。

輸入以0 0結束。

【輸出】:

乙個數,最大的氣氛值和。

【樣例輸入】71

1111

111 32 3

6 47 4

4 53 5

0 0【樣例輸出】

5【分析】

如上例,上司與小兵之間的關係構成一棵樹。

5| \

3 4| \ | \

1 2 6 7

又是求最優解,並且每乙個節點的取捨關乎到全域性 因此,此題可用樹形動態規劃

我們可用f[v][0]儲存不選編號為v的節點的最優解,f[v][1]儲存選編號為v的節點的最優解

//大陣列的定義最好不要寫在函式裡,這樣會使函式棧控制項不足 

#include#include#include#define m 1000 //陣列最大長度

int shu[m][m],xb[m][m],shs[m],qf[m],f[m][2];

int main()

maxlev=-1;

for(i=1;i<=n;i++)

shu[s][0]++;

shu[s][shu[s][0]]=i;

if(s>maxlev)maxlev=s; }

//2、動態規劃

for(i=maxlev;i>0;i--)

else

}//狀態轉移

}}

s=0;

for(i=1;i<=shu[1][0];i++)//從樹根獲取最優方案

printf("最大氣氛值:%d\n",s);

return 0;

}

樹形動態規劃

description 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1現在這顆樹枝條太多了,需要剪...

樹形動態規劃

分類 演算法 2012 07 01 21 53 494人閱讀收藏 舉報tree output input struct演算法 description 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我...

選課 樹形動態規劃

題目大意 在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程...