概率dp。
这是我做的第一个概率dp,应该算是入门题吧。
一个状态可以转移到四种状态。
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX_N = 1000 + 10;
double dp[MAX_N][MAX_N];
int s, n;
int main()
{
while(scanf("%d%d", &n, &s) != EOF)
{
dp[n][s] = 0.0;
for(int i = n; i >= 0; i--)
{
for(int j = s; j >= 0; j--)
{
if(i == n && j == s)
continue;
//可以转移到四种状态
dp[i][j] = (i * (s - j) * dp[i][j + 1] + (n - i) * j * dp[i + 1][j] + (n - i) * (s - j) * dp[i + 1][j + 1] + n * s) / (n * s - i * j);
}
}
printf("%.4lf\n" , dp[0][0]);
}
return 0;
}