洛谷P1122 最大子樹和(樹形dp dfs)

2021-10-06 09:11:22 字數 1703 閱讀 1632

2020.5.21

萌新自從上次區域賽那題碰壁,就勵志學好樹形dp,先從簡單題練練手。

樹形結構,前向星自不用說,觀察給出的資料,在每一層的子問題是剪枝和不剪枝,那肯定是如果對答案貢獻大於零就不剪,小於0就剪掉,所以有如下公式

dp[u]

= dp[v]

>

0? dp[v]

:0

回到問題上,我們的子樹可能不止乙個,那就加等,最後的答案就是每一層的最優解。

最近好好練練dp,因為還是太重要了。

最近訓練有所收穫,能夠處理一些dp問題了,昨天群裡的面試題只花了一分鐘就能看出轉移公式了,再接再厲吧。

**:

#include

using

namespace std;

#define limit (100000 + 5)

//防止溢位

#define inf 0x3f3f3f3f

#define inf 0x3f3f3f3f3f

#define lowbit(i) i&(-i)

//一步兩步

#define eps 1e-6

#define fastio ios::sync_with_stdio(false);cin.tie(0);

#define ff(a) printf("%lld\n",a );

#define pi(a,b) pair

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

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

#define mint(a,b,c) min(min(a,b), c)

#define mod 998244353

#define fopen freopen("c:\\users\\administrator01\\clionprojects\\untitled24\\data.txt", "rt", stdin)

typedef

long

long ll;

typedef

unsigned

long

long ull;

ll read()

while

(s >=

'0'&& s <=

'9')

return x * sign;

}//快讀

void

write

(ll x)

int n , m;

int dp[limit]

;struct nodeedge[limit<<1]

;int head[limit<<1]

,cnt;

void

init()

void

add(

int u,

int v)

int f[limit]

;int ans;

void

dfs(

int u,

int pre)

} ans =

max(ans, dp[u]);

}int

main()

dfs(1,

0);write

(ans)

;return0;

}

洛谷P1122 最大子樹和

提交該題 討論 題解記錄 小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題 一株奇怪的花卉,上面共連有n 朵花,共有n 1條枝幹將花兒連...

P1122 最大子樹和 (樹形DP)

第一次寫樹形dp,找了乙個簡單的題,先熟悉一下套路,雖然自己的這種寫法,過了,可以求到最大的子樹和,但是不能求到每個結點的最大子樹和,只有某一部分的最大子樹和的根,它是正確的,其他結點都是打工仔。遞迴下去,以子樹推當前結點和子樹的最優值,是可以辦到的 情況1 如果當前子樹 0,就不更新 情況2 如果...

P1122 最大子樹和

小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題 一株奇怪的花卉,上面共連有nn朵花,共有n 1n 1條枝幹將花兒連在一起,並且未修剪時...