MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

树状DP HOJ 2500

Posted on 2011-08-08 18:45  MDeath-Kid  阅读(329)  评论(0)    收藏  举报
HOJ 2500
 1 #define FOPEN freopen("/media/3CBCB387BCB33A6A/1.txt","r",stdin);
2 #define MAXN 203
3 int n;
4 short dp[MAXN][2];
5
6 struct str_hash {
7 size_t operator () (conststring& str) const {
8 unsigned long __h =0;
9 for(size_t i =0;i<str.size(); i++)
10 __h =5* __h +str[i];
11 return size_t (__h);
12 }
13 };
14
15 hash_map <string,int,str_hash> has;
16 vector<int> vec[MAXN];
17 unsigned char status[MAXN][2];
18
19
20 int DP(int x,int f) {
21 if(vec[x].size() ==0) {
22 dp[x][f] = f;
23 return f;
24 }
25 if(dp[x][f] !=-1) {
26 return dp[x][f];
27 }
28 dp[x][f] =0;
29 if(f) {
30 for(int i =0;i<vec[x].size();i++) {
31 dp[x][f] += DP( vec[x][i], !f);
32 status[x][f] |= status[vec[x][i]][false];
33 }
34 }
35 else {
36 for(int i =0;i<vec[x].size();i++) {
37 int idx = vec[x][i];
38 int a = DP( vec[x][i], !f),b = DP(vec[x][i],f);
39 if(a== b) status[x][f] =true;
40 elseif (a>b) status[x][f] |= status[idx][true];
41 else status[x][f] |= status[idx][false];
42 dp[x][f] += max(a,b);
43 }
44 }
45
46 dp[x][f] += f;
47 return dp[x][f];
48 }
49
50 void init() {
51 has.clear();
52 SET(dp,-1);
53 SET(status,false);
54 for(int i =0;i<n;i++)
55 vec[i].clear();
56 char ss[100],st[100];
57 scanf(" %s",ss);
58 has[ss] =0;
59 int cnt=1;
60 for(int i =1;i<n;i++) {
61 scanf(" %s %s",ss,st);
62 if(has.find(ss) == has.end())
63 has[ss] = cnt++;
64 if(has.find(st) == has.end())
65 has[st] = cnt++;
66 vec[has[st]].push_back(has[ss]);
67 }
68 int a = DP(0,1);
69 int b = DP(0,0);
70 printf("%d ",max(a,b));
71 if(a == b)
72 printf("No\n");
73 elseif (a>b) {
74 if (status[0][true]) printf("No\n");
75 else printf("Yes\n");
76 }
77 else {
78 if (status[0][false]) printf("No\n");
79 else printf("Yes\n");
80 }
81 }
82
83 int main() {
84 FOPEN;
85 while(~scanf("%d",&n) && n) {
86 init();
87 }
88 }

  总会有这样那样的悲剧诞生,codeblocks的控制台出毛病了,找了老半天没弄好,接着就是这个题目,做的最差的要算hash_map了,用的这么纠结,一会吧hash_map 和 string - char[] - CString 总结下,昨天打开STL标准库那本书,这么多 @-@

自己的树状DP是最差的了,毫无顿悟的感觉,完全感觉跟以前理解的一个样,比较容易懂的就算这是个递归的形式,比较容易写,其实就是记忆化搜索,每个节点根据题目会有很多不同的状态,大都基于父子关系,一种与子的关系(HOJ 2500),比如说:取我必需不取子,设 dp[i][j] 表是 j == 1?取得第 i 个节点,必不取子节点 :没取第 i 个节点;这样在一个树上做记忆化搜索,另一种同时与父子都有关系(HOJ 2514 这个也是我一WA到死的悲剧啊- -!~),既然没AC就不说了。暂时做了这两个题,还看过几道其他的树DP,感觉这类问题必需得仔细的想好状态之间的关系,一次不成十有八九就挂,而且关系之间挺复杂,待深入~!