POJ--2486--Apple Tree--树形回溯DP
2013-03-23 10:30
351 查看
反思:在写代码的过程中,尽量使代码的行为符合实际的逻辑,避免出现与实际逻辑无关甚至相违背的代码,尽管这些代码看上去不是那么的重要,但这是十分隐蔽的Bug.
参考题解:点击打开链接
这是典型的回溯型树状dp。dp[i][j][0]代表以i为根节点的子树最多j步后回到i能吃到的最多的苹果,dp[i][j][1]代表以i为根节点的子树最多j步后不回到i节点最多能吃到的子树。那么状态转移就分三步了。
(1)dp[i][j+2][0] = max(dp[i][j+2][0], dp[i][j-k][0]+dp[son][k][0]);
(2)dp[i][j+1][1] = max(dp[i][j+1][1], dp[i][j-k][0]+dp[son][k][1]); 人留在i的子节点son的子树中
(3)dp[i][j+2][1] = max(dp[i][j+2][1], dp[i][j-k][1]+dp[son][k][0]); 人留在不是son的i的子节点的子树中
参考题解:点击打开链接
这是典型的回溯型树状dp。dp[i][j][0]代表以i为根节点的子树最多j步后回到i能吃到的最多的苹果,dp[i][j][1]代表以i为根节点的子树最多j步后不回到i节点最多能吃到的子树。那么状态转移就分三步了。
(1)dp[i][j+2][0] = max(dp[i][j+2][0], dp[i][j-k][0]+dp[son][k][0]);
(2)dp[i][j+1][1] = max(dp[i][j+1][1], dp[i][j-k][0]+dp[son][k][1]); 人留在i的子节点son的子树中
(3)dp[i][j+2][1] = max(dp[i][j+2][1], dp[i][j-k][1]+dp[son][k][0]); 人留在不是son的i的子节点的子树中
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<algorithm> #define INF 99999999 #define maxn 210 using namespace std; vector<int> g[maxn]; int n,k; int dp[maxn][maxn][2]; int p[maxn],a[maxn]; int temp[maxn][2]; bool init() { int x,y; if(scanf("%d%d",&n,&k)!=EOF) { for(int i=0;i<=n;i++) for(int j=0;j<=k;j++) dp[i][j][0]=dp[i][j][1]=-INF; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); g[i].clear(); dp[i][0][0]=dp[i][0][1]=a[i]; } for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); g[x].push_back(y); g[y].push_back(x); } memset(p,-1,sizeof(p)); return true; } return false; } void build(int u) { for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(v==p[u])continue; p[v]=u; build(v); } } void DP_process(int u) { for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(v==p[u])continue; DP_process(v); for(int j=0;j<=k;j++) { temp[j][0]=dp[u][j][0]; temp[j][1]=dp[u][j][1]; } for(int j=0;j<=k;j++) { for(int d=0;d<=j;d++) { dp[u][j+2][0]=max(dp[u][j+2][0],temp[d][0]+dp[v][j-d][0]); dp[u][j+1][1]=max(dp[u][j+1][1],temp[d][0]+dp[v][j-d][1]); dp[u][j+2][1]=max(dp[u][j+2][1],temp[d][1]+dp[v][j-d][0]); } } } } void solve() { build(1); DP_process(1); for(int i=k;i>=0;i--) if(dp[1][i][1]>=0) { printf("%d\n",dp[1][i][1]); break; } } int main() { freopen("2486.txt","r",stdin); while(init()) solve(); return 0; }
相关文章推荐
- poj 2486 Apple Tree (带回溯的树形dp)
- poj2486 Apple Tree 树形dp背包
- poj 2486 Apple Tree (树形dp)
- poj 2486 apple tree 树形DP 不懂的一定把你讲懂
- poj 2486 Apple Tree 树形dp
- POJ 2486 Apple Tree (树形dp)
- poj 2486 apple tree 树形DP 不懂的一定把你讲懂
- poj 2486 Apple Tree(树形DP,状态好纠结。。。)
- POJ 2486 Apple Tree(树形dp)
- POJ 2486 apple tree(树形dp)
- POJ 2486 树形背包DP Apple Tree
- 树形DP______Apple Tree( POJ 2486 )
- 【POJ 2486】 Apple Tree (树形DP)
- POJ - 2486 Apple Tree(树形DP)
- POJ 2486 Apple Tree 树形DP
- POJ 2486 Apple Tree (树形dp)
- POJ 2486 Apple Tree(树形DP)
- poj 2486 Apple Tree (树形dp)
- POJ 2486 Apple Tree - 树形DP
- poj 2486 Apple Tree(树形dp)