Hnoi2018 道路 樹形DP

2021-08-19 08:46:56 字數 2814 閱讀 1523

w 國的交通呈一棵樹的形狀。w 國一共有 n−

1 n−1

個城市和

n n

個鄉村,其中城市從

1' role="presentation">11到

n−1 n−1

編號,鄉村從

1 1

到 n' role="presentation">n

n編號,且

1 1

號城市是首都。道路都是單向的,本題中我們只考慮從鄉村通往首都的道路網路。對於每乙個城市,恰有一條公路和一條鐵路通向這座城市。對於城市i, 通向該城市的道路(公路或鐵路)的起點,要麼是乙個鄉村,要麼是乙個編號比

i' role="presentation">i

i大的城市。 沒有道路通向任何鄉村。除了首都以外,從任何城市或鄉村出發只有一條道路;首都沒有往 外的道路。從任何鄉村出發,沿著唯一往外的道路走,總可以到達首都。

w 國的國王小 w 獲得了一筆資金,他決定用這筆資金來改善交通。由於資金有限,小 w 只能翻修 n−

1 n−1

條道路。小 w 決定對每個城市翻修恰好一條通向它的道路,即從公路和鐵 路中選擇一條並進行翻修。小 w 希望從鄉村通向城市可以盡可能地便利,於是根據人口調 查的資料,小 w 對每個鄉村制定了三個引數,編號為

i i

的鄉村的三個引數是 ai

' role="presentation">aia

i​,bi

b

i​ 和 ci

c

i。假設 從編號為

i i

的鄉村走到首都一共需要經過

x' role="presentation">x

x條未翻修的公路與

y y

條未翻修的鐵路,那麼該鄉村 的不便利值為ci

⋅(ai

+x)⋅

(bi+

y)' role="presentation">ci⋅

(ai+

x)⋅(

bi+y

)ci⋅

(ai+

x)⋅(

bi+y

)在給定的翻修方案下,每個鄉村的不便利值相加的和為該翻修方案的不便利值。 翻修 n−

1 n−1

條道路有很多方案,其中不便利值最小的方案稱為最優翻修方案,小 w 自然 希望找到最優翻修方案,請你幫助他求出這個最優翻修方案的不便利值。

大家都說這題是一道普及dp,但也沒有看到有很多人在考場a啊。所以這種題還是要引起我們的注意。

考慮樹形dp,考慮對與每一顆子樹,我們求它的所有的葉子節點的最小權值。由於這是一顆二叉樹,所以我們可以從兩個子節點轉移到父節點,即對於每乙個父節點列舉修建哪一條邊。但是還要使得我們的選擇是合法的,即對於左兒子和右兒子的最小的權值和的情況滿足從他們到根節點的情況一致。所以我們可以設定dp的狀態了,即dp

i,j,

k dpi

,j,k

表示第i i

個節點以上的路徑裡有

i' role="presentation">i

i未修建的公路和

j j

條未修建的鐵路。轉移方程就很好地出來了。

另外,好像要用滾動陣列卡一下空間。。。

/*********************====

* auhtor : ylsoi

* problem : road

* algorithm : dp

* time : 2018.4.24

* ********************=*/

#include

#include

#include

#include

#include

using

namespace

std;

void file()

#define rep(i,a,b) for(register int i=a;i<=b;++i)

#define drep(i,a,b) for(register int i=a;i>=b;--i)

#define mrep(i,x) for(register int i=beg[x];i;i=e[i].last)

#define ll long long

const

int maxn=4e4+1;

const

int maxd=40+1;

int n,ch[maxn][2],a[maxn],b[maxn],c[maxn],cnt,be[maxn];

ll dp[maxn/2+1][maxd][maxd];

#define lc ch[u][0]

#define rc ch[u][1]

ll _min(ll x,ll y)

be[lc]=++cnt;be[rc]=++cnt;

dfs(lc,cnt0+1,cnt1);

dfs(rc,cnt0,cnt1+1);

rep(j,0,cnt0)rep(k,0,cnt1)

dp[be[u]][j][k]=_min(dp[be[lc]][j][k]+dp[be[rc]][j][k+1],dp[be[lc]][j+1][k]+dp[be[rc]][j][k]);

cnt-=2;

}int main()

rep(i,1,n)scanf("%d%d%d",&a[i+n-1],&b[i+n-1],&c[i+n-1]);

be[1]=++cnt;

dfs(1,0,0);

printf("%lld\n",dp[1][0][0]);

return

0;}

HNOI2018 道路 樹形DP

hnoi2018 道路 題目描述 w 國的交通呈一棵樹的形狀。w 國一共有 n 1 個城市和 n 個鄉村,其中城市從 1 到 n 1 編號,鄉村從 1 到 n 編號,且 1 號城市是首都。道路都是單向的,本題中我們只考慮從鄉村通往首都的道路網路。對於每乙個城市,恰有一條公路和一條鐵路通向這座城市。對...

心情 HNOI2018遊記

day 0.全機房的人好像都在做題。然而下午是社團節的遊園會,身為社幹的我風風雨雨在外面各種搬凳子搬椅子換場地招待外校同學 就這樣我好像什麼都沒有複習。晚上就一起去酒店了。大概因為是高一的緣故,並沒有非常的緊張。住進了酒店,滿腦子都是和豆豆 ww3113306 如何吃吃吃玩玩玩。非常開心的擺了一晚上...

比賽 HNOI2018 總結

一將功成萬骨枯,我就是給那些隊爺做基數的 看完題,暴力好打,然後就打 覺得第三題模型很好建啊,先看第三題吧 結果第三題是最。的 圖建出來,先看樹的情況,設dp試一下 結果一直只想著一維的dp,沒去想0 1狀態表示是否選取,於是老久都沒想出來 第一題一開始沒看到30分的狀壓,突然看到,然後就趕緊碼一下...