1864: [Zjoi2006]三色二叉树

1864: [Zjoi2006]三色二叉树

链接

分析:

  做得最智障的一题了。。。

  首先中间输出两个数之间没空格(换行居然也过了。。。), 写了dp[i][0/1/2],后来知道其实dp[i][0/1]就行了,最zz的一个bug,,,char pos = 1...

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #define L ls[u]
 4 #define R rs[u]
 5 
 6 using namespace std;
 7  
 8 const int N = 500100;
 9  
10 int ls[N],rs[N],dp1[N][3],dp2[N][3],pos = 1;
11 char s[N];
12 
13 void dfs(int u) {
14     if (s[u] == '0') return;
15     if (s[u] == '1' || s[u] == '2') {
16         L = ++pos;
17         dfs(pos); 
18     } 
19     if (s[u] == '2') {
20         R = ++pos;
21         dfs(pos);
22     }
23 }
24  
25 int tsl,tsr;
26 void DP(int u) {
27     if (!u) return ;
28     dp1[u][0] = 1;dp1[u][1] = dp1[u][2] = 0;
29     dp2[u][0] = 1;dp2[u][1] = dp2[u][2] = 0;
30     
31     DP(L);
32     DP(R);
33      
34     dp1[u][0] = max(dp1[L][1] + dp1[R][2], dp1[L][2] + dp1[R][1]) + 1;
35     dp1[u][1] = max(dp1[L][0] + dp1[R][2], dp1[L][2] + dp1[R][0]);
36     dp1[u][2] = max(dp1[L][0] + dp1[R][1], dp1[L][1] + dp1[R][0]);
37      
38     dp2[u][0] = min(dp2[L][1] + dp2[R][2], dp2[L][2] + dp2[R][1]) + 1;
39     dp2[u][1] = min(dp2[L][0] + dp2[R][2], dp2[L][2] + dp2[R][0]);
40     dp2[u][2] = min(dp2[L][0] + dp2[R][1], dp2[L][1] + dp2[R][0]);
41 }
42 int main () {
43     scanf("%s",s+1);
44     dfs(1);
45 /*  for (int i=1; i<=n; ++i) 
46         cout << ls[i] << " "<< rs[i] << "\n";*/
47     DP(1);
48     cout << max(dp1[1][0],max(dp1[1][1],dp1[1][2])) << " ";
49     cout << min(dp2[1][0],min(dp2[1][1],dp2[1][2]));
50     return 0;
51 }

猜你喜欢

转载自www.cnblogs.com/mjtcn/p/9199584.html