您的位置:首页 > 运维架构

HDU 4405 Aeroplane chess(概率DP入门)

2015-07-10 08:58 471 查看
开始把dp[i] 设成了 从0到>=i的期望值。。。。然后差点跪了。。。确实是个水题。。不过头脑灵活一下。

思路:设dp[i] 为从i到>=n的期望值。

如果i有航班,dp[i] = dp[mark[i]];

如果有航班,dp[i] = sigma(dp[i+j]) / 6 + 1 ( 1<= j <=6)

代码:

#include<cstdio>
#include<algorithm>
#include<iostream>

using namespace std;
const int maxn = 100050;

double dp[maxn];
int mark[maxn];
int n,m;

void init(){
dp[0] = 0;
fill(mark,mark+maxn,-1);
fill(dp,dp+maxn,0);
}

int main(){
while(~scanf("%d%d",&n,&m)){
if(n + m  == 0) break;
init();
int a,b;
while(m--){
scanf("%d%d",&a,&b);
mark[a] = b;
}
for(int i=n-1;i>=0;i--){
if(mark[i] != -1) dp[i] = dp[mark[i]];
else{
double tmp = 0;
for(int j=1;j<=6;j++) tmp += dp[i+j];
dp[i] = tmp / 6 + 1;
}
}

printf("%.4f\n",dp[0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: