题意:一个战士初始有 f 点攻击力,每一天都会被随机分到 n 个洞穴(概率等同),每个洞穴有相应的困难值 ci , 若 f > ci ,则战士可以花费 ti 天的时间攻破洞穴,完成试验,否则花费一天的时间把攻击力 + ci ,然后重新试验, 求完成试验的期望天数
( ti = )
分析:设 dp[ f ] 表示攻击力为 f 完成试验的期望,则存在两种情况
① f > ci , dp[ f ] + = ti / n ;
② f<=ci , dp[ f ] + = ( 1 + dp [ i + ci ] ) / n ;
因为当前攻击力 f 的变化不规律,所以借助记忆化搜索
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 105;
int n,f,c[N],t[N];
double dp[20000];
double solve(int f)
{
if(dp[f]!=0) return dp[f];
for(int i=1;i<=n;i++)
{
if(f>c[i])
{
dp[f]+=(double)t[i]/n;
}
else
{
dp[f]+=(1+solve(f+c[i]))/n;
}
}
return dp[f];
}
int main()
{
while(~scanf("%d%d",&n,&f))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&c[i]);
t[i]=(1.0+sqrt(5))/2*c[i]*c[i];
}
memset(dp,0,sizeof(dp));
printf("%.3f\n",solve(f));
}
return 0;
}