二叉苹果树——树形DP-n^3枚举
二叉苹果树
https://ac.nowcoder.com/acm/problem/50505
题意
以1为根节点,保留q个边与1连通。最大的边权和。
思路
,暴力? or or
每个结点取子树 条边,暴力n^2枚举,表示以 为根的子树保留 条边的最大权值和。
dp转移方程
前提条件:
题目链接
//#pragma GCC optimize(2) //#pragma GCC target ("sse4") #include<bits/stdc++.h> //typedef long long ll; #define ull unsigned long long #define int long long #define F first #define S second #define endl "\n"//<<flush #define eps 1e-6 #define base 131 #define lowbit(x) (x&(-x)) #define db double #define PI acos(-1.0) #define inf 0x3f3f3f3f #define MAXN 0x7fffffff #define INF 0x3f3f3f3f3f3f3f3f #define ferma(a,b) pow(a,b-2) #define mod(x) (x%mod+mod)%mod #define pb push_back #define decimal(x) cout << fixed << setprecision(x); #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #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; #ifndef ONLINE_JUDGE #include "local.h" #endif template<typename T> inline T fetch(){T ret;cin >> ret;return ret;} template<typename T> inline vector<T> fetch_vec(int sz){vector<T> ret(sz);for(auto& it: ret)cin >> it;return ret;} template<typename T> inline void makeUnique(vector<T>& v){sort(v.begin(), v.end());v.erase(unique(v.begin(), v.end()), v.end());} void file() { #ifdef ONLINE_JUDGE #else freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin); // freopen("D:/LSNU/codeforces/duipai/WA.txt","w",stdout); #endif } const int N=1e2+5; struct node { int v,w; }; vector<node>G[N]; int dp[N][N],n,q; void dfs(int u,int fat) { for(auto it:G[u]) { int v=it.v,w=it.w; if(v==fat) continue; dfs(v,u); for(int i=n;i>=1;i--) { for(int j=0;j<i;j++) { dp[u][i]=max(dp[u][i],dp[u][j]+w+dp[v][i-j-1]); } } } } signed main() { IOS; file(); cin>>n>>q; for(int i=1;i<n;i++) { int u,v,w; cin>>u>>v>>w; G[u].pb({v,w}); G[v].pb({u,w}); } dfs(1,0); cout<<dp[1][q]<<endl; return 0; }