hdu1054Strategic Game(树形DP)

链接

归属简单树形DP 挺简单的 跟第一道一样 就是我跑偏了题意。。以为要覆盖点 纠结啊 推了N久 推不出啊 然后就郁闷了 打了局游戏 边想边打 实在想不出 看下题解 跑偏了

分两种情况D 方程见代码

 

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define N 2010

 8 int f[N];

 9 struct node

10 {

11     int f,ch,m1,m0,br;

12     void init()

13     {

14         f = m0 =ch = br =0;

15         m1 = 1;

16     }

17 }tr[N];

18 void dfs(int u)

19 {

20     int child = tr[u].ch;

21     while(child)

22     {

23         dfs(child);

24         tr[u].m1+=min(tr[child].m0,tr[child].m1);

25         tr[u].m0+=tr[child].m1;

26         child = tr[child].br;

27     }

28 }

29 int main()

30 {

31     int i,j,n,u,m,v;

32     while(scanf("%d",&n)!=EOF)

33     {

34         memset(f,0,sizeof(f));

35         for(i = 1; i <= n ; i++)

36         {

37             scanf("%d:(%d)",&u,&m);

38             u++;

39             if(!f[u])

40             tr[u].init();

41             for(j = 1; j <= m ; j++)

42             {

43                 scanf("%d",&v);

44                 v++;

45                 tr[v].init();

46                 tr[v].f = u;

47                 tr[v].br = tr[u].ch;

48                 tr[u].ch = v;

49                 f[v] = 1;

50             }

51         }

52         for(i = 1; i <= n ; i++)

53         {

54             if(!f[i])

55             break;

56         }

57         dfs(i);

58         cout<<min(tr[i].m0,tr[i].m1)<<endl;

59     }

60     return 0;

61 }
View Code

 

你可能感兴趣的:(game)