摘果子 DFS (偽AC)

2021-08-29 10:20:07 字數 1072 閱讀 5820

題目:

給出一棵樹,選則結點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 轉移過來 為什麼是正確的呢?顯然只選子樹或只選兄弟是正確...