http://acm.pku.edu.cn/JudgeOnline/problem?id=1074

Код:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNUM 101
#define max(a,b)    (((a) > (b)) ? (a) : (b))
#define min(a,b)    (((a) < (b)) ? (a) : (b))
struct Struction
{
 int lValue;
 int a,b;
 int op;
 bool type_1,type_2;
};
void ParseLine(char * line,Struction * pro,int rIdx,int & idxMax);
void CalExpection();
double d[2][14][MAXNUM];
double p[2][MAXNUM];
Struction program_1[MAXNUM],program_2[MAXNUM];
int xMax,yMax,sumMax,varCon,curr,prev;
char cmdLine[256];
char var[10][24];
int main()
{
 int loop;
 gets(cmdLine);
 loop = atoi(cmdLine);
 while(loop--)
 {
  varCon = 0;
  xMax = 0;
  while(gets(cmdLine))
  {
   if(strlen(cmdLine) == 0)
    continue;
   if(strcmp(cmdLine,"END") == 0)
   {
    break;
   }
   ParseLine(cmdLine,program_1,0,xMax);
  }
  yMax = 0;
  while(gets(cmdLine))
  {
   if(strlen(cmdLine) == 0)
    continue;
   if(strcmp(cmdLine,"END") == 0)
   {
    break;
   }
   ParseLine(cmdLine,program_2,2,yMax);
  }
  sumMax = xMax + yMax + 1;
  varCon += 4;
  CalExpection();
  varCon -= 4;
  int minIdx;
  for(int i = varCon ; i > 0 ; i--)
  {
   minIdx = 0;
   for(int j = 1 ; j < i ; j++)
   {
    if(strcmp(var[j],var[minIdx]) < 0)
     minIdx = j;
   }
   printf("%.04f\n",d[prev][minIdx + 4][xMax]);
   if(minIdx < (i - 1))
   {
    strcpy(var[minIdx],var[i - 1]);
    d[prev][minIdx + 4][xMax] = d[prev][i + 3][xMax];
   }
  }
  if(loop > 0)
   printf("\n");
 }
    return 0;
}
void ParseLine(char * line,Struction * pro,int rIdx,int & idxMax)
{
 int i;
 char *pos, *start, *last;
 last = strstr(line,":=");
 if(last == NULL)
  return;
 //1,3
 last[0] = '\0';
 last += 2;
 pos = last;
 while(pos[0] == ' ' || pos[0] == '\t' || pos[0] == '\r' || pos[0] == '\n')
  pos++;
 start = pos;
 idxMax++;
 pro[idxMax+2].lValue = rIdx;
 pro[idxMax+2].a = rIdx;
 pro[idxMax+2].type_1 = false;
 pro[idxMax+2].b = rIdx + 1;
 pro[idxMax+2].type_2 = false; 
 if(start[0] >= '0' && start[0] <= '9')
 {
  while(pos[0])
  {
   if(pos[0] == ' ' || pos[0] == '\t' || pos[0] == '\r' || pos[0] == '\n' || pos[0] == '+' || pos[0] == '-')
   {
    break;
   }
   pos++;
  }
  last = pos;
  while(last[0])
  {
   if(last[0] == '+')
   {
    pro[idxMax+2].op = 1;
    break;
   }
   else if(last[0] == '-')
   {
    pro[idxMax+2].op = -1;
    break;
   }
   else
    last++;
  }
  last++;
  pos[0] = '\0';
  pro[idxMax].lValue = rIdx;
  pro[idxMax].a = atoi(start);
  pro[idxMax].type_1 = true;
  pro[idxMax].b = 0;
  pro[idxMax].type_2 = true;
  pro[idxMax].op = 1;
 }
 else
 {
  while(pos[0])
  {
   if(pos[0] == ' ' || pos[0] == '\t' || pos[0] == '\r' || pos[0] == '\n' || pos[0] == '+' || pos[0] == '-')
   {
    break;
   }
   else if(pos[0] >= 'a' && pos[0] <= 'z')
    pos[0] -= 32;
   pos++;
  }
  last = pos;
  while(last[0])
  {
   if(last[0] == '+')
   {
    pro[idxMax+2].op = 1;
    break;
   }
   else if(last[0] == '-')
   {
    pro[idxMax+2].op = -1;
    break;
   }
   else
    last++;
  }
  last++;
  pos[0] = '\0';
  for(i = 0 ; i < varCon ; i++)
  {
   if(strcmp(start,var[i]) == 0)
    break;
  }
  if(i == varCon)
  {
   strcpy(var[varCon],start);
   varCon++;
  }
  pro[idxMax].lValue = rIdx;
  pro[idxMax].a = i + 4;
  pro[idxMax].type_1 = false;
  pro[idxMax].b = 0;
  pro[idxMax].type_2 = true;
  pro[idxMax].op = 1;
 }
 //2
 pos = last;
 while(pos[0] == ' ' || pos[0] == '\t' || pos[0] == '\r' || pos[0] == '\n')
  pos++;
 start = pos;
 idxMax++;
 if(start[0] >= '0' && start[0] <= '9')
 {
  pro[idxMax].lValue = rIdx + 1;
  pro[idxMax].a = atoi(start);
  pro[idxMax].type_1 = true;
  pro[idxMax].b = 0;
  pro[idxMax].type_2 = true;
  pro[idxMax].op = 1;
 }
 else
 {
  while(pos[0])
  {
   if(pos[0] == ' ' || pos[0] == '\t' || pos[0] == '\r' || pos[0] == '\n')
   {
    break;
   }
   else if(pos[0] >= 'a' && pos[0] <= 'z')
    pos[0] -= 32;
   pos++;
  }
  pos[0] = '\0';
  for(i = 0 ; i < varCon ; i++)
  {
   if(strcmp(start,var[i]) == 0)
    break;
  }
  if(i == varCon)
  {
   strcpy(var[varCon],start);
   varCon++;
  }
  pro[idxMax].lValue = rIdx + 1;
  pro[idxMax].a = i + 4;
  pro[idxMax].type_1 = false;
  pro[idxMax].b = 0;
  pro[idxMax].type_2 = true;
  pro[idxMax].op = 1;
 }
 //4
 idxMax += 2;
 pos = cmdLine;
 while(pos[0] == ' ' || pos[0] == '\t' || pos[0] == '\r' || pos[0] == '\n')
  pos++;
 start = pos;
 while(pos[0])
 {
  if(pos[0] == ' ' || pos[0] == '\t' || pos[0] == '\r' || pos[0] == '\n')
  {
   break;
  }
  else if(pos[0] >= 'a' && pos[0] <= 'z')
   pos[0] -= 32;
  pos++;
 }
 pos[0] = '\0';
 for(i = 0 ; i < varCon ; i++)
 {
  if(strcmp(start,var[i]) == 0)
   break;
 }
 if(i == varCon)
 {
  strcpy(var[varCon],start);
  varCon++;
 }
 pro[idxMax].lValue = i + 4;
 pro[idxMax].a = rIdx;
 pro[idxMax].type_1 = false;
 pro[idxMax].b = 0;
 pro[idxMax].type_2 = true;
 pro[idxMax].op = 1;
}
void CalExpection()
{
 int i,num,sup,sub,x,y;
 double k,tempP;
 curr = 0;
 prev = 1;
 p[prev][0] = 1;
 for(i = 0 ; i < varCon ; i++)
  d[prev][i][0] = 0;
 for(num = 1 ; num < sumMax ; num++)
 {
  sup = min(num,xMax);
  sub = max(num - yMax,0);
  for(x = sub ; x <= sup ; x++)
  {
   for(i = 0 ; i < varCon ; i++)
   {
    y = num - x;
    d[curr][i][x] = 0;
    tempP = 0;
    if(x > 0)
    {
     if(program_1[x].lValue == i)
     {
      if(program_1[x].type_1 == true)
       k = program_1[x].a;
      else
       k = d[prev][program_1[x].a][x-1];
      if(program_1[x].type_2 == true)
       k += program_1[x].op * program_1[x].b;
      else
       k += program_1[x].op * d[prev][program_1[x].b][x-1];
     }
     else
      k = d[prev][i][x-1];
     if(y == 0)
      tempP = 1;
     else if(y == yMax)
     {
      if(x == xMax)
       tempP = p[prev][x-1] / (p[prev][x-1] + p[prev][x]);
      else
       tempP = p[prev][x-1] / (p[prev][x-1] + p[prev][x] / 2);
     }
     else
     {
      if(x == xMax)
       tempP = p[prev][x-1] / (p[prev][x-1] + 2 * p[prev][x]);
      else
       tempP = p[prev][x-1] / (p[prev][x-1] + p[prev][x]);
     }
     d[curr][i][x] += (k * tempP);
    }
    if(y > 0)
    {
     if(program_2[y].lValue == i)
     {
      if(program_2[y].type_1 == true)
       k = program_2[y].a;
      else
       k = d[prev][program_2[y].a][x];
      if(program_2[y].type_2 == true)
       k += program_2[y].op * program_2[y].b;
      else
       k += program_2[y].op * d[prev][program_2[y].b][x];
     }
     else
      k = d[prev][i][x];
     
     d[curr][i][x] += (k * (1 - tempP));
    }
   }
  }
  
  for(x = sub ; x <= sup ; x++)
  {
   y = num - x;
   p[curr][x] = 0;
   if(x > 0)
   {
    if(y == yMax)
     p[curr][x] += p[prev][x - 1];
    else
     p[curr][x] += (p[prev][x - 1] / 2);
   }
   if(y > 0)
   {
    if(x == xMax)
     p[curr][x] += p[prev][x];
    else
     p[curr][x] += (p[prev][x] / 2);
   }
  }
  i = curr;
  curr = prev;
  prev = i;
 }
}