http://acm.hdu.edu.cn/showproblem.php?pid=6558
题意:拿到beta pack的期望游戏次数
思路:概率dp,定义dp[i][j],p为i,q为j的时候的期望次数。
dp[i][j]=赢的概率 *(拿到包的概率*1+拿不到包的概率*dp[i][j+2])+输的概率 * (dp[i][j+1.5])
注意
1.5的时候需要hash处理。
注意int转double
注意跳出条件是当q为100时,返回期望次数:1/p(不懂,但是挺对的
注意dp可以初始化为0,因为 if(0.0000001)cout<<1; 是可以输出1的。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define FI first
#define SE second
#define MP make_pair
#define PII pair<int,int>
const LL mod =1e9+7;
const int MX = 2e5+5;
double dp[105][205];
double dfs(int p,int q){
if(dp[p][q])return dp[p][q];
if(q==200)return 100/(double)p;//这个期望次数是对的就是了
dp[p][q]=(double)p/100*((double)q/200*1+(dfs(p,min(q+4,200))+1)*(200-(double)q)/200)+(100-(double)p)/100*(dfs(p,min(200,q+3))+1);
return dp[p][q];
}
int main(){
int ca=0;
int T;cin>>T;while(T--){
memset(dp,0,sizeof(dp));
int p;cin>>p;
printf("Case %d: %.10lf\n",++ca,dfs(p,4));
}
return 0;
}