標籤:define tor printf stream style code href string memset
傳送門
分析
一道簡單的樹型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_pairvector<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 二叉蘋果樹