xuchuhan
2024-11-20 11:26:19
蒟蒻第一次自己弄出来期望 DP,写篇题解纪念。
其实和我之前练习到的这道题目很像。
这道题目我们可以记忆化搜索求解。其实递推也可以但是边界可能比记搜难写一些,故这里选择记搜。
看到
这道题目就做完了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=105;
int a,b,c;
double dp[N][N][N];
double DFS(int x,int y,int z){
if(x>=100||y>=100||z>=100)return 0;//终止状态
if(dp[x][y][z]!=-1)return dp[x][y][z];//记搜的记录
double tmp=0;
//以下是转移
if(x)tmp+=(DFS(x+1,y,z)+1.0)*1.0*double(x)/double(x+y+z);
if(y)tmp+=(DFS(x,y+1,z)+1.0)*1.0*double(y)/double(x+y+z);
if(z)tmp+=(DFS(x,y,z+1)+1.0)*1.0*double(z)/double(x+y+z);
return dp[x][y][z]=tmp;
}
signed main(){
cin>>a>>b>>c;
for(int i=0;i<=100;i++)
for(int j=0;j<=100;j++)
for(int k=0;k<=100;k++)
dp[i][j][k]=-1;//初始状态
printf("%.10lf",DFS(a,b,c));//答案
return 0;
}
祝大家 NOIp2024 rp++。