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 }

 

posted @ 2020-03-13 22:22  古比  阅读(93)  评论(0编辑  收藏  举报