ZOJ 3640(Help Me Escape)

匿名 (未验证) 提交于 2019-12-03 00:03:02

题意:一个战士初始有 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; }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!