链接:https://www.acwing.com/problem/content/220/
一定要走他所有可能走的路。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
double dp[20][20][20][20][5][5];
int A,B,C,D;
double dfs(int a,int b,int c,int d,int x,int y)
{
if(a+(x==0)+(y==0)>=A&&b+(x==1)+(y==1)>=B&&c+(x==2)+(y==2)>=C&&d+(x==3)+(y==3)>=D) return dp[a][b][c][d][x][y]=0;//返回是给dp赋值
if(dp[a][b][c][d][x][y]>=0) return dp[a][b][c][d][x][y];
int sum=a+b+c+d+(x!=4)+(y!=4);
if(54-sum<=0) return dp[a][b][c][d][x][y]=1e8;
double ans=0;
if(a<13)
{
ans+=(dfs(a+1,b,c,d,x,y)+1)*(13-a)/(54-sum);
}
if(b<13)
{
ans+=(dfs(a,b+1,c,d,x,y)+1)*(13-b)/(54-sum);
}
if(c<13)
{
ans+=(dfs(a,b,c+1,d,x,y)+1)*(13-c)/(54-sum);
}
if(d<13)
{
ans+=(dfs(a,b,c,d+1,x,y)+1)*(13-d)/(54-sum);
}
double minn=1e8;
if(x==4)
{
minn=min(minn,(dfs(a,b,c,d,0,y)+1)/(54-sum));
minn=min(minn,(dfs(a,b,c,d,1,y)+1)/(54-sum));
minn=min(minn,(dfs(a,b,c,d,2,y)+1)/(54-sum));
minn=min(minn,(dfs(a,b,c,d,3,y)+1)/(54-sum));
ans+=minn;//一定要放在括号里面。否则x!=4会加上1e8
}
if(y==4)
{
minn=min(minn,(dfs(a,b,c,d,x,0)+1)/(54-sum));
minn=min(minn,(dfs(a,b,c,d,x,1)+1)/(54-sum));
minn=min(minn,(dfs(a,b,c,d,x,2)+1)/(54-sum));
minn=min(minn,(dfs(a,b,c,d,x,3)+1)/(54-sum));
ans+=minn;
}
dp[a][b][c][d][x][y]=ans;
return ans;
}
int main()
{
scanf("%d%d%d%d",&A,&B,&C,&D);
memset(dp,-1,sizeof dp);
dfs(0,0,0,0,4,4);
if(dp[0][0][0][0][4][4]<1e8/2)//可能出现精度错误。
printf("%.3lf\n",dp[0][0][0][0][4][4]);
else printf("-1.000\n");
}