ZOJ 1134 Strategic Game(树形DP)
2013-04-28 21:54
295 查看
dp[i][0]表示i结点放士兵的最优值,dp[i][1]表示i结点不放士兵的最优值
因为是一棵树,所以状态转移方程:
1.dp[i][0]+=min(dp[v][0],dp[v][1])表示i结点放士兵的最优值累加上v结点放士兵的最优值和v结点不放士兵的最优值.
2.dp[i][1]+=dp[v][0] 很自然的就是i结点不放士兵的最优值累加上v结点放士兵的最优值,因为要覆盖每一条边,所以必须一条边必须有一点要有士兵.
v为i的儿子节点.
因为是一棵树,所以状态转移方程:
1.dp[i][0]+=min(dp[v][0],dp[v][1])表示i结点放士兵的最优值累加上v结点放士兵的最优值和v结点不放士兵的最优值.
2.dp[i][1]+=dp[v][0] 很自然的就是i结点不放士兵的最优值累加上v结点放士兵的最优值,因为要覆盖每一条边,所以必须一条边必须有一点要有士兵.
v为i的儿子节点.
#include <iostream> #include <cstdio> #include <memory.h> #include <vector> using namespace std; const int maxn=1510; vector<int>g[maxn]; int fa[maxn],dp[maxn][2],n; char buf[100]; void dfs(int u){ if(dp[u][1]!=-1){ return; } dp[u][0]=1; dp[u][1]=0; for (int i=0;i<g[u].size();++i){ dfs(g[u][i]); dp[u][0]+=min(dp[g[u][i]][1],dp[g[u][i]][0]); dp[u][1]+=dp[g[u][i]][0]; } } int main(){ while (scanf("%d",&n)==1){ memset(fa,-1,sizeof(fa)); memset(dp,-1,sizeof(dp)); for (int i=0;i<n;++i){ g[i].clear(); } for (int i=0;i<n;++i){ int u,m,v; scanf("%d:(%d)",&u,&m); while (m--){ scanf("%d",&v); g[u].push_back(v); fa[v]=u; } } int r=0; while (fa[r]!=-1){ r=fa[r]; } dfs(r); printf("%d\n",min(dp[r][0],dp[r][1])); } return 0; }
相关文章推荐
- ZOJ 1134 Strategic Game(树形DP)
- ZOJ1134 POJ1463 HDU1054 Strategic Game, 树形DP
- zoj1134 Strategic Game(DP/图论)
- HDU 1054 Strategic Game(树形DP)
- POJ 1463 Strategic game (树形DP) 解题报告
- 树形DP_______Strategic game( POJ 1463 )
- ZOJ 3201 Tree of Tree 树形DP
- zoj-3626 Treasure Hunt I (树形dp)
- ZOJ2834--Maximize Game Time(树形DP)
- ZOJ 2111 Starship Troopers(树形DP)
- zoj 3626 Treasure Hunt I (树形dp)
- hdu 1054 Strategic Game 经典树形DP
- ZOJ - 3201 Tree of Tree 树形DP
- POJ - 1463 Strategic game(树形DP)
- (树形DP) zoj 3201
- hdu 1054 Strategic Game 树形dp基础&&模板
- HDU 1054 Strategic Game(树形DP)
- ZOJ 3231 Apple Transportation 树形dp
- Strategic Game - HDU 1054 树形dp
- hdu 1054 Strategic Game(树形DP)