从这里可以发现 只要知道递推方程,就可以把dp的过程用记忆化递归表示出来
其实记忆化bfs 记忆化递归 ……只要是计算某种状态后,将其保存下来的过程,都是dp!!!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h>
double dp[200][200];
double di(int n,int m)
{
if(dp[n][m]!=-1)
return dp[n][m];
if(m==0)
return dp[n][m]=0;
if(m==1)
return dp[n][m]=(n+1)*1.0/2;
if(n==0)
return dp[n][m]=1.0*di(2,m-2)+1;
if(n==1)
return dp[n][m]=1.0*(m*di(2,m-1)+m*(m-1)/2*di(3,m-2))*1.0/((m+1)*m/2)+1;
return dp[n][m]=1.0*(di(n+1,m-1)*n*m+di(n+2,m-2)*m*(m-1)/2)*1.0/(n*m+m*(m-1)/2)+1+1.0*(n-1)*n/2/(n*m+(m*(m-1)/2));
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n||m)
{
double t;
int i,j;
for(i=0;i<=100;i++)
{
for(j=0;j<=100;j++)
{
dp[i][j]=-1;
}
}
printf("%.2lf\n",di(n,m));
}
}