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