題目描述:
/**
牛牛和羊羊非常無聊.他們有n + m個共同朋友,他們中有n個是無聊的,m個是不無聊的。
每個小時牛牛和羊羊隨機選擇兩個不同的朋友a和b.
(如果存在多種可能的pair(a, b),任意乙個被選到的概率相同。),
然後牛牛會和朋友a進行交談,羊羊會和朋友b進行交談。
在交談之後,如果被選擇的朋友之前不是無聊會變得無聊。
現在你需要計算讓所有朋友變得無聊所需要的時間的期望值。
輸入描述:
輸入包括兩個整數n 和 m(1 ≤ n, m ≤ 50)
輸出描述:
輸出乙個實數,表示需要時間的期望值,四捨五入保留一位小數。
輸入例子1:
2 1輸出例子1:
1.5*/
思路如下:
概率題(採用記憶化搜尋策略 o(m*n))
f(n,m)表示n個無聊,m個有聊變為全部無聊期望時間
狀態(n, m)的下乙個狀態可能是 (n, m) (n+1, m-1) (n+2, m-2)分別對應概率為p1, p2, p3
f(n, m)=p1*(f(n, m)+1)+p2*(f(n+1, m-1)+1)+p3*(f(n+2, m-2)+1)
total=m+n
p1=(n c 2)/(total c 2)
p2=(n c 1)*(m c 1)/(total c 2)
p3=(m c 2)/(total c 2)
p1+p2+p3=1
簡化公式
(1-p1)*f(n, m)=1+p2*f(n+1, m-1)+p3*f(n+2, m-2)
由於此種情況n>=1 m>=1 p1肯定不為0
p1=n*(n-1)/((n+m)*(n+m-1))
p2=2*m*n/((n+m)*(n+m-1))
p3=m*(m-1)/((n+m)*(n+m-1))
base case:
f(n,0)=0
f(n, 負數)=0
**如下:
#include#include#define max 101
using namespace std;
//標記備忘錄是否有效
bool marked[max][max];
//行為n 列為m memo只記錄n>=1 m>=1的情況
double memo[max][max];
//n在第一次進入就確保》=1,且n只會增加
//m在第一次進入確保》=1,m會減少
double dfs(int n, int m)
double p1, p2, p3;
p1=1.0*n*(n-1)/((n+m)*(n+m-1));
p2=1.0*2*m*n/((n+m)*(n+m-1));
p3=1.0*m*(m-1)/((n+m)*(n+m-1));
memo[n][m]=1.0*(1+p2*dfs(n+1, m-1)+p3*dfs(n+2, m-2))/(1-p1);
marked[n][m]=true;
return memo[n][m];
}int rounddouble(double number)
int main()
愛奇藝 筆試刷題
題目描述 乙個完整的括號字串定義規則如下 1 空字串是完整的。2 如果s是完整的字串,那麼 s 也是完整的。3 如果s和t是完整的字串,將它們連線起來形成的st也是完整的。例如,和 是完整的括號字串,和 是不完整的括號字串。牛牛有乙個括號字串s,現在需要在其中任意位置盡量少地新增括號,將其轉化為乙個...
愛奇藝 筆試刷題
題目描述 牛牛選擇了乙個正整數x,然後把它寫在黑板上。然後每一天他會擦掉當前數字的最後一位,直到他擦掉所有數字。在整個過程中,牛牛會把所有在黑板上出現過的數字記錄下來,然後求出他們的總和sum.例如x 509,在黑板上出現過的數字依次是509,50,5,他們的和就是564.牛牛現在給出乙個sum,牛...
愛奇藝 筆試刷題
題目描述 牛牛學習了氣泡排序,並寫下以下氣泡排序的偽 注意牛牛排序的陣列a是從下標0開始的。bubblesort a repeat length a 1 times for every i from 0 to length a 2 if a i a i 1 then swap a i and a i...