演算法:hdu 4003 Find Metal Mineral (樹形背包dp)

來源:互聯網
上載者:User

題意

給一棵n個節點的樹, 節點編號為1~n, 每條邊都有一個花費值.

有k個機器人從S點出發, 問讓 機器人遍曆所有邊,最少花費值多少?

思路

很好的一題, 推薦!

前天看的這題, 今天才想出來的. 方法想出來後,代碼很簡單

最近做的幾道dp,都是一開始沒什麼想法,然後過兩天再想就想出來了,也許是因 為人的潛意識其實會一直在想某個問題

翻看一下網上其他人的做法, 和我的稍有不同, 他們是用f(i, j)表示子樹i用j個機器人的最少花費, 一開始我也是這樣

去想,但是沒想到怎麼去狀態轉移.

然後 我換了一種思路,很快就想出來了

如果從根節點出發,遍曆所有節點之後再回到原點, 那麼最少的花費 一定是所有邊的權值之和sum的兩倍, 因為每條邊都走了兩次.

而這題, 遍曆完之後,並不需要走回出 發點, 所以, 有些邊只走了一次就可以了,

如果用1台機器人走, 最少的的花費 = sum * 2 - {根節點到葉 子節點路徑的最大權值和}

如果是j台機器走, 我們要讓j台機器人只走一次的邊的權值之和盡量大, 也就 是減少的花費盡量大.

那麼, 我的狀態表示為:

f(i, j) 表示子樹i用j個機器人最多可以減少的花 費.

對於i節點, 它的每個子節點的子樹是一組物品, 我們可以選擇派1,2,...j個機器人走去

需要注意, 如果派x個機器人走向某個子節點v, 那麼邊edge(i, v)就會被走了x次, 花費了x*w(i, v).

而原始的sum中 每條邊只走了兩次, 所以走edge(i, v)的花費減少了 2*w(i,v) - x*w(i,v)

最後可以得到狀態轉移式 :

f(i, j) = max{ max{f(i, j-k) + f(v, k) + 2*w(i,v) - k*w(i,v) | 1<=k<=j }  | v是i的兒子節點 }

最終答案ans = sum * 2 - f(s, k)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.