题目链接:http://poj.org/problem?id=1644
题目思路:用dp[i][j]记录在i位置回合数为j的概率,递推即可。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
#include<list>
#include<iostream>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define Max 110
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
double dp[60][60];
char s[10];
int t,m,T;
int to[60];
int main()
{
int i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&T);
to[0]=0;to[m+1]=0;to[m+2]=-1;
for(i=1;i<=m;i++)
{
if(scanf("%d",&to[i])==0)
{
scanf("%s",s);
to[i]=inf;
}
}
memset(dp,0,sizeof(dp));
dp[0][0]=1.0;
for(j=0;j<=T;j++)
for(i=0;i<=m;i++)
{
// printf("i %d j %d dp %lf\n",i,j,dp[i][j]);
if(to[i+1]==inf)
dp[i+1][j+2]+=dp[i][j]*0.5;
else
dp[i+1+to[i+1]][j+1]+=dp[i][j]*0.5;
if(to[i+2]==inf)
dp[i+2][j+2]+=dp[i][j]*0.5;
else
dp[i+2+to[i+2]][j+1]+=dp[i][j]*0.5;
}
for(i=0;i<T;i++)
dp[m+1][T]+=dp[m+1][i];
if(dp[m+1][T]==0.5)
printf("Push. 0.5000\n");
else if(dp[m+1][T]<0.5)
printf("Bet against. %.4lf\n",dp[m+1][T]);
else
printf("Bet for. %.4lf\n",dp[m+1][T]);
}
}
本文提供了一种使用动态规划解决POJ 1644题目的方法,通过递推计算在不同位置及回合数下的概率,最终得出是否应该押注的结论。
270

被折叠的 条评论
为什么被折叠?



