poj 2486( 树形dp)
来源:互联网 发布:兔子白网络 编辑:程序博客网 时间:2024/06/05 04:38
题目链接:http://poj.org/problem?id=2486
思路:经典的树形dp,想了好久的状态转移。dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从i出发走了j步最后回到i。于是我们把所有到情况归结为3种:
1、从u(v是其中一颗子树)出发,走了j步,最后停在了v,则有dp[u][j+1][0]=max(dp[u][j+1][0],dp[u][j-k][1]+dp[v][k][0]);(从u->v多走了1步).
2、从u出发,走了j步,最后停在了u的另一棵子树上,则有dp[u][j+2][0]=max(dp[u][j+2][0],dp[u][j-k][0]+dp[v][k][1])(从u->v,,v->u多走了2步).
3、从u出发,走了j步,最后回到u,则有dp[u][j+2][1]=max(dp[u][j+2][1],dp[u][j-k][1]+dp[v][k][1])(从u->v,,v->u多走了2步).
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define MAXN 222 8 9 int n,m,val[MAXN];10 vector<vector<int> >g;11 int dp[MAXN][MAXN][2];12 13 void dfs(int u,int father)14 {15 for(int i=0; i<=m; i++)dp[u][i][0]=dp[u][i][1]=val[u];16 for(int i=0; i<g[u].size(); i++) {17 int v=g[u][i];18 if(v==father)continue;19 dfs(v,u);20 for(int j=m; j>=0; j--) {21 for(int k=0; k<=j; k++) {22 dp[u][j+1][0]=max(dp[u][j+1][0],dp[u][j-k][1]+dp[v][k][0]);23 dp[u][j+2][0]=max(dp[u][j+2][0],dp[u][j-k][0]+dp[v][k][1]);24 dp[u][j+2][1]=max(dp[u][j+2][1],dp[u][j-k][1]+dp[v][k][1]);25 }26 }27 }28 }29 30 int main()31 {32 int _case,u,v;33 while(~scanf("%d%d",&n,&m)) {34 g.clear();35 g.resize(n+2);36 for(int i=1; i<=n; i++)scanf("%d",&val[i]);37 for(int i=1; i<n; i++) {38 scanf("%d%d",&u,&v);39 g[u].push_back(v);40 g[v].push_back(u);41 }42 dfs(1,-1);43 printf("%d\n",dp[1][m][0]);44 }45 return 0;46 }
0 0
- poj 2486 树形dp
- poj 2486 树形DP
- poj 2486 树形dp
- poj 2486 树形DP
- poj-2486-树形dp
- poj 2486( 树形dp)
- POJ 2486 树形DP
- poj 2486 树形dp
- poj 2486(树形dp)
- POJ 2486 树形dp
- poj 2486 树形dp
- POJ-2486-树形dp
- poj 2486 树形dp
- poj 2486 (树形DP)
- POJ 2486 经典树形dp
- POJ 2486 树形DP+背包
- POJ 2486 Apple Tree 树形DP
- POJ 2486 Apple Tree 树形dp
- loj 1165(bfs+康托展开)
- loj 1185(bfs)
- ural 1018(树形dp)
- poj 3140(树形dp)
- loj 1034(最小点基)
- poj 2486( 树形dp)
- poj 1935(树形dp)
- loj 1168(Tarjan应用)
- loj 1004(dp)
- poj 2378(树形dp)
- poj 1463(树形dp)
- loj 1011(状态压缩+记忆化搜索)
- loj 1013(LCS+记忆化搜索)
- loj 1154(最大流+枚举汇点)