题目地址:POJ 2096
第一发概率DP。详情看这篇博客,讲的很清楚了。
代码如下:
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=1e-8;
double dp[1005][1005];
int main()
{
int i, j, n, m;
double p0, p1, p2, p3;
while(scanf("%d%d",&n,&m)!=EOF){
dp[n][m]=0;
for(i=n;i>=0;i--){
for(j=m;j>=0;j--){
if(i==n&&j==m) continue ;
p1=(n-i)*(m-j)*1.0;
p2=(n-i)*j*1.0;
p3=i*(m-j)*1.0;
dp[i][j]=(p1*dp[i+1][j+1]+p2*dp[i+1][j]+p3*dp[i][j+1]+n*m)/(n*m-i*j);
}
}
printf("%.4f\n",dp[0][0]);
}
return 0;
}