1. 程式人生 > >loj10153 二叉蘋果樹

loj10153 二叉蘋果樹

cstring include for using ack std time d+ ont

傳送門

分析

一道簡單的樹型dp,我們用dp[i][j]記錄考慮到第i個點,保留了j個樹枝的最多蘋果數,然後dfs求解即可。

代碼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include
<vector> #include<set> #include<map> #include<stack> using namespace std; #define pb push_back #define mp make_pair vector<pair<int,int> >v[110]; pair<int,int>son[2][110]; int dp[110][110],n,m; inline void dfs(int x,int fa){ int cnt=-1; for(int i=0;i<v[x].size();i++)
if(v[x][i].first!=fa){ son[++cnt][x]=v[x][i]; dfs(v[x][i].first,x); } return; } inline void getdp(int x){ if(!son[0][x].first)return; getdp(son[0][x].first); getdp(son[1][x].first); for(int i=0;i<n-2;i++) for(int j=0;j<=i;j++) dp[x][i
+2]=max(dp[x][i+2],dp[son[0][x].first][j]+ dp[son[1][x].first][i-j]+son[0][x].second+son[1][x].second); for(int i=0;i<n-1;i++) for(int j=0;j<=i;j++) dp[x][i+1]=max(dp[x][i+1],max(dp[son[0][x].first][j]+ son[0][x].second,dp[son[1][x].first][i-j]+son[1][x].second)); return; } int main(){ int i,j,k,x,y; scanf("%d%d",&n,&m); for(i=1;i<n;i++){ scanf("%d%d%d",&x,&y,&k); v[x].pb(mp(y,k)); v[y].pb(mp(x,k)); } memset(dp,0,sizeof(dp)); dfs(1,0); getdp(1); printf("%d\n",dp[1][m]); return 0; }

loj10153 二叉蘋果樹