BZOJ4832: [Lydsy1704月赛]抵制克苏恩 (记忆化搜索 + 概率DP)

时间:2023-03-08 16:21:17
BZOJ4832: [Lydsy1704月赛]抵制克苏恩 (记忆化搜索 + 概率DP)

题意:模拟克苏恩打奴隶战对对方英雄所造成的伤害

题解:因为昨(今)天才写过记忆化搜索 所以这个就是送经验了

   1A还冲了个榜 但是我惊奇的发现我数组明明就比数据范围开小了啊???

#include <bits/stdc++.h>
using namespace std; int k, a, b, c;
double dp[][][][]; double dfs(int at, int x, int y, int z)
{
if(dp[at][x][y][z]) return dp[at][x][y][z]; double tmp = ;
double fm = 1.0 * (x + y + z + 1.0);
tmp += 1.0 / fm * (dfs(at - , x, y, z) + 1.0);
if(x) tmp += 1.0 * x / fm * dfs(at - , x - , y, z);
if(y)
{
if(x + y + z == ) tmp += 1.0 * y / fm * dfs(at - , x + , y - , z);
else tmp += 1.0 * y / fm * dfs(at - , x + , y - , z + );
}
if(z)
{
if(x + y + z == ) tmp += 1.0 * z / fm * dfs(at - , x, y + , z - );
else tmp += 1.0 * z / fm * dfs(at - , x, y + , z);
}
dp[at][x][y][z] = tmp;
return tmp;
} int main()
{
int T;
scanf("%d", &T);
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
{
if(i + j > ) continue;
for(int k = ; k < ; k++)
{
if(i + j + k > ) continue;
dp[][i][j][k] = 1.0 / (i + j + k + 1.0);
}
} while(T--)
{
scanf("%d%d%d%d", &k, &a, &b, &c);
double ans = dfs(k, a, b, c);
printf("%.2lf\n", ans);
}
return ;
}