2011-04-26 20:18:19 题目地址:http://acm.fzu.edu.cn/problem.php?pid=1022 #include<iostream> #include<stack> #include<string> #define N 10010 using namespace std; struct Node { int lChild; int rChild; }nodes[N]; int dp[N][2],dp2[N][2];// dp[n][k]用来存储最多情况,表示以n节点(n节点染色由k决定,k=0表示染成非绿色,反之,为绿色)为根的树最多绿色节点数 int head,temp; // dp2[][]用来存储最少情况~~~~~ void creatTree(char *str) { int i,j; stack<int> sta; head=temp=0; for(i=0,j=1;str[i]!='/0';i++) { if(str[i]=='0') { nodes[temp].lChild=nodes[temp].rChild=-1; if(sta.empty()) break; temp=sta.top(); sta.pop(); } else if(str[i]=='1') { nodes[temp].lChild=(j++); nodes[temp].rChild=-1; temp=nodes[temp].lChild; } else { nodes[temp].lChild=(j++); nodes[temp].rChild=(j++); sta.push(nodes[temp].rChild); temp=nodes[temp].lChild; } } } void DP(int n) { if(nodes[n].lChild==-1&&nodes[n].rChild==-1)// 当节点n为叶节点 { dp[n][0]=0; dp[n][1]=1; dp2[n][0]=0; dp2[n][1]=1; } else if(nodes[n].rChild==-1)// 当节点n有一个儿子 { DP(nodes[n].lChild); // 当节点为非绿色是,为了是绿色节点最多其唯一儿子节点一定是染成绿色 dp[n][0]=dp[nodes[n].lChild][1]; dp[n][1]=dp[nodes[n].lChild][0]+1; // 当节点n为非绿色是,情况比较不一样,因为其唯一儿子节点可以染成绿色,也可以染成非绿色,取使其绿色节点为最少的情况 dp2[n][0]=dp2[nodes[n].lChild][0]<dp2[nodes[n].lChild][1]?dp2[nodes[n].lChild][0]:dp2[nodes[n].lChild][1]; dp2[n][1]=dp2[nodes[n].lChild][0]+1; } else // 当节点n有两个儿子 { DP(nodes[n].lChild); DP(nodes[n].rChild); dp[n][1]=dp[nodes[n].lChild][0]+dp[nodes[n].rChild][0]+1; dp[n][0]=dp[nodes[n].lChild][1]+dp[nodes[n].rChild][0]>dp[nodes[n].lChild][0]+dp[nodes[n].rChild][1] ? dp[nodes[n].lChild][1]+dp[nodes[n].rChild][0]:dp[nodes[n].lChild][0]+dp[nodes[n].rChild][1]; dp2[n][1]=dp2[nodes[n].lChild][0]+dp2[nodes[n].rChild][0]+1; dp2[n][0]=dp2[nodes[n].lChild][1]+dp2[nodes[n].rChild][0]<dp2[nodes[n].lChild][0]+dp2[nodes[n].rChild][1] ? dp2[nodes[n].lChild][1]+dp2[nodes[n].rChild][0]:dp2[nodes[n].lChild][0]+dp2[nodes[n].rChild][1]; } } int main() { int i,j; char str[N]; while (scanf("%s",str)!=EOF) { creatTree(str); DP(0); printf("%d ",dp[0][0]>dp[0][1]?dp[0][0]:dp[0][1]); printf("%d/n",dp2[0][0]<dp2[0][1]?dp2[0][0]:dp2[0][1]); /*for(i=0;i<strlen(str);i++) { cout<<i<<" "; cout<<"L:"<<nodes[i].lChild<<" "; cout<<"R:"<<nodes[i].rChild<<" "; cout<<endl; }*/ } return 0; }