題意:
乙個系統有s個子系統,一共會產生n中bug。某人一天可以發現乙個bug,這個bug屬於乙個子系統,屬於乙個種類,每個bug屬於某個子系統的概率是1/s,屬於某個分類的概率是1/n,問發現n種bug並且每個子系統都發現bug的天數的期望。
分析:簡單的入門概率dp,在這之前沒有做個這個型別,所以講解也是看的網上的,這裡直接貼過來。
dp[i][j]表示已經找到i種bug,j個系統的bug,達到目標狀態的天數的期望dp[n][s]=0;要求的答案是dp[0][0];
dp[i][j]可以轉化成以下四種狀態:
dp[i][j],發現乙個bug屬於已經有的i個分類和j個系統。概率為(i/n)*(j/s);
dp[i][j+1],發現乙個bug屬於已有的分類,不屬於已有的系統.概率為 (i/n)*(1-j/s);
dp[i+1][j],發現乙個bug屬於已有的系統,不屬於已有的分類,概率為 (1-i/n)*(j/s);
dp[i+1][j+1],發現乙個bug不屬於已有的系統,不屬於已有的分類,概率為 (1-i/n)*(1-j/s);
整理便得到轉移方程
ps:需要注意的是,遞推公式一定要化簡,不讓會wa
#include #include #include #include #include using namespace std;
int const maxn = 1005;
double dp[maxn][maxn];
//dp[i][j]表示的是已經找到i種bug,並且屬於j個系統的bug,達到目標狀態的天數的期望
//dp[n][s]=0,因為這時已經達到目標狀態了,最終結果是dp[0][0]
//dp[i][j] = (dp[i][j]*(i)*(j) + dp[i+1][j]*(n-i)*(j)+ dp[i][j+1]*(i)*(s-j) + dp[i+1][j+1]*(n-i)*(s-j) + n*s )/(n*s) ;
int main()
}printf("%.4f\n",dp[0][0]) ;
}return 0;
}
概率dp的邊界處理 POJ 2096
說的是有n個bug,和s個系統。現在乙個人一天能發現乙個bug,它可能是任何乙個系統中的,也可能會發現已經發現過的bug。問,他發現全部n個bug,並且s個系統中都出現bug的天數的期望。是借用kuangbin大神的 1 include2 include3 include4 include 5usi...
POJ2096題解 期望dp
1.有無數個bug 2.將無數個bug分為n種,s類 3.期望意義上,多少天能至少在n種s類裡都找到乙個bug 這道題和hdu4336很像。原子操作 atom operation 為每天找出乙個bug,這個bug 有可能是已找出的i種bug中的一種,這個概率為i n 有可能是已找出的j類bug中的一...
期望入門 PoJ2096 總結
發現圖包根本用不完系列 time limit 10000ms memory limit 64000k total submissions 1485 accepted 647 case time limit 2000ms special judge description input file con...