#105 Div2 D

方針

コード

/*! g++ -g bag-of-mice.cpp
 */

#include <iostream>
#include <vector>
#include <cassert>
#include <iomanip>



using namespace std;




class BagOfMice{
public:
  int w_, b_;
  vector<vector<vector<double> > > prob; //prob[player][w][b] 0: p, 1: d
  BagOfMice(int w, int b) : w_(w), b_(b){
    prob.resize(2, vector<vector<double> >(w+1, vector<double>(b+1, -1)));
    for(int i = 0; i <= w; i++){
      prob[0][i][0] = 1;
      prob[1][i][0] = 0;
      if(b>=1)prob[1][i][1] = 1.0 / (i+1);
    }
    for(int i = 0; i <= b; i++){
      prob[0][0][i] = 0;
      prob[1][0][i] = 0;
    }
  }

  double get_prob(){
    for(int b = 1; b <= b_; ++b){
      for(int w = 1; w <= w_; ++w){
	double dw(w), db(b);
	// cerr << w << " " << b << endl;
	// assert(prob[1][w][b-1] != -1);
	// assert(prob[0][w-1][b-1] != -1);
	// assert(prob[0][w][b-2] != -1);
	prob[0][w][b] = dw / (dw + db) + db / (dw + db) * prob[1][w][b-1];
	if(b!=1){
	  prob[1][w][b] = db / (dw + db) * (dw/(dw+db-1) * prob[0][w-1][b-1] +
					    (db-1)/(dw+db-1) * prob[0][w][b-2]);
	}
      }
    }
    return prob[0][w_][b_];    
  }

};

int main(int argc, char *argv[]){
  int w, b;
  cin >> w >> b;
  BagOfMice x(w, b);
  cout << setprecision(10) << x.get_prob() << endl;
  // cout << x.get_prob() << endl;
  return 0;
}