題目:
給出一棵樹,選則結點x
xx可以獲得價值v[x
]v[x]
v[x]
,但是代價是p[x
]p[x]
p[x]
。可以選擇這個結點僅當這個結點的父親被選擇。求代價不超過m
mm時的最大價值。
這道題資料n
≤1000
n\leq 1000
n≤1000
。但是資料太菜(不是jzoj的),所以o(玄
學)
o(玄學)
o(玄學
)也是可以過的。。。
首先樹形dpdp
dp肯定是可取的。設f[i
][j]
f[i][j]
f[i][j
]表示以第i
ii個結點為根,代價為j
jj是的最大價值。方程略。
這裡要講的是dfs
dfsdf
s (≥
n2
)o(\geq n^2)
o(≥n2)
#include
#include
#include
#define n 2100
using
namespace std;
int v[n]
,p[n]
,n,m,tot,ans,head[n]
;bool vis[n]
;struct edge
e[n*2]
;void
add(
int from,
int to)
void
dfs(
int x,
int s,
int du)
//s表示價值,du表示代價
intmain()
ans=
-1e9
;dfs(1
,v[1
],p[1]
);printf
("%d\n"
,max
(ans,0)
);}
AC日記 手寫堆ac合併果子(傻子)
今天整理最近的考試題 發現乙個東西叫做優先佇列 priority queue 說白了就是大根堆 但是我對堆的了解還是很少的 所以我決定手寫乙個堆 於是我寫了乙個簡單的堆 手寫的堆說白了就是個二叉樹 能不更新維護的二叉樹,每次維護的時間為logn 但是各種查詢 empty,top什麼的 時間為1 感覺...
1272 摘果子(樹形dp,dfs
description 樹有n個節點,樹根為1號節點,這顆果樹上有m個節點長出果實 根節點1有可能長出果實 小明要從節點1出發採集這些果實,從乙個節點爬到相鄰的另乙個節點所需要的時間為1,採集果實不需要時間,問如果要採集這m個果實,從節點1出發,並且最後需要回到節點1,最少需要多少的時間。節點編號1...
NOIP2017模擬9 3A組 摘果子
7 3就是樹上揹包問題,有乙個很經典的做法 按照dfs序反著來dp,那麼f i j 表示的就是dfs序為i的點,受了j的毒的值 如果i這個點選,那麼f i j 可以從f i 1 j p i 轉移過來 否則可以從f 跨過i這個子樹的下乙個值 j 轉移過來 為什麼是正確的呢?顯然只選子樹或只選兄弟是正確...