google面試原題: 有m個紅糖,n個白糖,每次取一顆糖,如果取到紅糖,直接喫掉,如果取到白糖則放進去再取一顆,再取的這一顆無論是什麼顏色都喫掉。問最後剩下的那顆是紅糖的概率。這題是用動態規劃做的,從m=1, n=0 m=1, n=1開始推,能找出一個狀態轉移方程(也就是代碼裏面那個p[i][j] = xxxx 的式子)
上代碼:
#include <iostream>
#include <vector>
using namespace std;
double get_prob(int m, int n, vector<vector<double>> &p) {
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
p[i][j] = (double)i/(i+j)*p[i-1][j] //fetch one red
+ ((double)j/(i+j)) //fetch one white
* ( ((double)i/(i+j)) * p[i-1][j] //then, fetch one red
+ ((double)j/(i+j)) * p[i][j-1] ); //or, fetch one white
}
}
return p[m][n];
}
int main() {
int m, n;
m = 2;
n = 1;
vector<vector<double>> prob(m+1, vector<double>(n+1, 0.0));
//when white candy is 0, red candy is from 1 to m, the probability is 1
for(int i=1; i<=m; i++) {
prob[i][0] = 1.0;
}
cout << get_prob(m, n, prob) << endl;
return 0;
}