問題:stewart教授是一家公司總裁的顧問,這家公司計畫乙個公司聚會。這個公司有乙個層次結構;也就是,管理關係形成一棵以總裁為根的樹。人事部給每個雇員以喜歡聚會的程度來排名,這是乙個實數。為了使每個參加者都喜歡這個聚會,總裁不希望乙個雇員和他(她)的直接上司同時參加。
stewart教授面對一顆描述公司結構的樹,使用了10.4節描述的左子女、右兄弟表示法。樹中每個節點除了包含指標,還包含雇員的名字以及該雇員喜歡聚會的排名。描述乙個演算法,它生成一張客人列表,使得客人喜歡聚會的程度的總和最大。分析你的演算法的執行時間。
分析:
對每個節點新增兩個域selectroot和unselroot。selectroot意味著當該節點被選擇時,以該節點為根的子樹的最大聚會喜歡程度。unselroot意味著當該節點不被選擇時,以該節點為根的子樹的最大聚會喜歡程度。
假設原先每個節點的兩個域名字和聚會喜歡程度為name,like。初始時,每個葉子節點的selectroot為其like值,unselroot為0。
依次向上計算每個節點的selectroot和unselroot值
最終只需要檢視總裁節點,取其selectroot和unselroot中的最大值。
要記錄客人列表,則只需從樹的的第二層開始,每一層做如下操作:如果parent被選,則當前層都不選;如果parent未被選,則看當前層中每個節點的selectroot和uselroot的大小關係,如果selectroot大,則選中該節點,否則,不選該節點。遍歷完樹之後,參加的客人便都標記出來了。
計算n個節點的selectroot和unselroot,每次計算都只使用子節點的域值,所以整個計算的過程也只累加了樹中除了根的其它節點的域值(每個節點就被用一次)。所以演算法複雜度為o(n)。
動態規劃 一
在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分程若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴於當前面臨的狀態,又印象以後的發展,當各個階段決策確定後,就組成乙個決策序列,因而也就確定了整個過程的一條活...
動態規劃(一)
動態規劃的兩種常用形式 1 遞迴型 在函式中呼叫自身 優點 直觀,容易編寫 缺點 可能會因為遞迴層數太深導致爆棧,函式呼叫帶來額外時間開銷。無法使用滾動陣列節省空間。總體來說,比遞推型慢。2 遞推型 for迴圈 效率高,有可能使用滾動陣列節省空間。有的問題只能用遞迴解決,有的問題既可以用遞迴,也可以...
動態規劃 (一)
對於動態規劃的學習總共進行了兩節課,到現在為止還是一頭霧水,雖然看懂了老師上課講的例題,但是做v judge的時候還是都不太會,我主要認為我只知道了動態規劃的基本思想,就是將乙個大的問題,分成若干個小問題,但與貪心演算法不同的是,動態規劃中的每乙個小問題之間都相互影響,在每一步都取得最優解,且在不斷...