C Garland (樹形DP 子樹計數問題)

2021-10-03 20:52:02 字數 1386 閱讀 3120

又攻克一道樹形dp題,首先子樹計數問題,感覺都是先自下而上跑一遍dfs,然後根據題意然後抉擇得套路。

一顆有根樹,分成三棵子樹,保證點權和相互相等。

分析:子樹滿足ans/3,並且ans%3==0加入就可以了,滿足兩個點或者以上,就是行:為啥說2以上

這裡就是我得wa得點,可以所有得點值為0,你就知道了

//#pragma gcc optimize(2)

#include

//typedef long long ll;

//#define ull unsigned long long

#define int long long

#define f first

#define s second

#define endl "\n"

//<#define eps 1e-6

#define lowbit(x) (x&(-x))

#define pi acos(-1.0)

#define inf 0x3f3f3f3f

#define maxn 0x7fffffff

#define inf 0x3f3f3f3f3f3f3f3f

#define pa pair

#define ferma(a,b) pow(a,b-2)

#define pb push_back

#define all(x) x.begin(),x.end()

#define memset(a,b) memset(a,b,sizeof(a));

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

using

namespace std;

void

file()

const

int n=

3e6+5;

vector<

int>g[n]

,vec;

int a[n]

,dp[n]

,ans,sum;

void

dfs(

int u,

int fat)}}

signed

main()

dfs(root,0)

;if(vec.

size()

>=

2&&ans%3==

0)else

cout<<-1

}

收集果子(樹形dp)

題意 給你一棵樹,1為根節點,每個節點有果子數,每個節點的權值為其子樹果子的和。問多少種刪邊的方式,使得1節點的權值為k。思路 組成k的種類數?不就是多少種方法組成某個面值嗎,可以想到是樹上揹包。定義f i,j 為遞迴到第i個節點收集了j個果子的方案數。那麼有兩種子狀態 1 把 u,v 邊斷了,那麼...

P1122 最大子樹和 (樹形DP)

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

樹形DP 洛谷1122 最大子樹和

又是一道樹形dp的入門題,思想非常簡單 然而我最開始還是存了兩個狀態 傳送門 小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題 一株奇怪...