题意:一个战士初始有 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; }
来源:51CTO
作者:伴君
链接:https://blog.csdn.net/weixin_43209425/article/details/100731782