ZOJ 3640(Help Me Escape)
题意:一个战士初始有 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