動態規劃-最後剩下的是紅糖的概率問題

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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章