33,009
社区成员
发帖
与我相关
我的任务
分享
#include <iostream.h>
template <typename T>
T** new2(int m,int n,const T&valu)//动态创建二维数组
{
int i,j;
T **p;
p=new T*[m];
for(i=0;i<=m-1;i++)
{
p[i]=new T[n];
}
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
{
p[i][j]=valu;
}
}
return p;
}
template <typename T>
delete2(T**p,int m,int n)//销毁由new2创建的二维数组
{
for(int i=0;i<=m-1;i++)
{
delete []p[i];
}
delete []p;
}
template <typename T>
init2(T**p,int m,int n,const T&valu)//二维数组初始化
{
int i,j;
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
{
p[i][j]=valu;
}
}
}
template <typename T>
copy(T**p,T**tp,int m,int n)//拷贝二维数组
{
int i,j;
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
{
p[i][j]=tp[i][j];
}
}
}
double dp(int m,int n)//计算概率
{
int i,j;
double**p=new2(m+1,n+1,(double)0);
double**tp=new2(m+1,n+1,(double)0);
p[m][n]=1;
bool Aturn=true;
double rsp=0;
while(1)
{
if(Aturn)
{
init2(tp,m+1,n+1,(double)0);
bool finish=true;
rsp+=p[0][1];
p[0][1]=0;
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
{
if(p[i][j]!=0)
{
if(i-1>=0)tp[i-1][j]+=i*1.0/(i+j)*p[i][j];
if(j-1>=0)tp[i][j-1]+=j*1.0/(i+j)*p[i][j];
finish=false;
}
}
}
if(finish)
{
break;
}
copy(p,tp,m+1,n+1);
Aturn=false;
}else
{
init2(tp,m+1,n+1,(double)0);
bool finish=true;
rsp+=p[0][1];
p[0][1]=0;
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
{
if(p[i][j]!=0)
{
if(j-1>=0)tp[i][j-1]+=p[i][j];
finish=false;
}
}
}
if(finish)
{
break;
}
copy(p,tp,m+1,n+1);
Aturn=true;
}
}
delete2(p,m+1,n+1);
delete2(tp,m+1,n+1);
return rsp;
}
main()
{
int m,n;
cout<<"m:";
cin>>m;
cout<<"n:";
cin>>n;
cout<<dp(m,n)<<endl;
}