UVA1292 Strategic game
树形DP
题意:求最少需要多少个卫士,能够保卫家园 ,相邻位置只需要一个卫士;
这道题 这道题就只有dp公式这一难点
代码直接贴,(没提交过的代码)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=2e3+10; 4 struct node 5 { 6 int v,nxt; 7 }G[maxn<<2]; 8 int head[maxn];int num=-1; 9 int dp[maxn][10]; 10 void add(int u,int v) 11 { 12 G[++num].v=v;G[num].nxt=head[u];head[u]=num; 13 G[++num].v=u;G[num].nxt=head[v];head[v]=num; 14 } 15 void init() 16 { 17 memset(head,-1,sizeof(head)); 18 memset(dp,0,sizeof(dp)); 19 num=-1; 20 } 21 void dfs(int u,int fa) 22 { 23 dp[u][0]=0; 24 dp[u][1]=1; 25 for(int i=head[u];i!=-1;i=G[i].nxt){ 26 if(G[i].v==fa) continue; 27 int v=G[i].v; 28 dfs(v,u); 29 dp[u][0]+=dp[v][1]; 30 dp[u][1]+=min(dp[v][0],dp[v][1]); 31 } 32 } 33 int main() 34 { 35 int n; 36 while(scanf("%d",&n)!=EOF){ 37 init(); 38 int u,v,m; 39 for(int i=0;i<n;i++){ 40 scanf("%d:(%d)",&u,&m); 41 for(int j=0;j<m;j++){ 42 scanf("%d",&v); 43 add(u,v); 44 } 45 } 46 dfs(0,-1); 47 printf("%d\n",min(dp[0][0],dp[0][1])); 48 } 49 return 0; 50 }