問題可以分解成若干相互聯絡的階段,在每乙個階段都要做出決策,全部過程的決策是乙個決策序列。要使整個活動的總體效果達到最優的問題,稱為多階段決策問題。動態規劃就是解決多階段決策最優化問題的一種思想方法。
將所給問題的過程,按時間或空間特徵分解成若干相互聯絡的階段,以便按次序去求每階段的解
各階段開始時的客觀條件叫做狀態。
當各段的狀態取定以後,就可以做出不同的決定,從而確定下一階段的狀態,這種決定稱為決策。
由開始到終點的全過程中,由每段決策組成的決策序列稱為全過程策略,簡稱策略。
前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後一階段的狀態,這種關係描述了由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 乙個學生要從這些課程...