/**//* 如果已经知道走这些passage的顺序的话,应该可以dp出来的 但是这里不确定顺序,要选择最优,可以按照P/Q从大到小排序 遇到匪徒几率Q越小,出去几率P越大,肯定是我们优先考虑的! Help Bill to find out the probability that he can escape from this castle if he chose the optimal strategy.
dp[i][j]表示现在有钱j,在i个passage处,最后能够出去的概率 dp[n-1,j]=P[n-1] dp[i,j]=P[i]+Q[i]*dp[i+1,j-1]+(1-P[i]-Q[i])*dp[i+1,j] j>0 dp[i,j]=P[i]+(1-P[i]-Q[i])*dp[i+1,j] j=0
概率题期望题,一般都是表示现在离目标的值 (因为当前接下来的方案确定了,概率也知道了,而当前从前面过来就不确定概率了,其概率跟路径有关) */ #include<cstdio> #include<algorithm> using namespace std;
struct Pas { double p,q; bool operator<(const Pas&B)const { return p/q>B.p/B.q; } }pas[1010];
double dp[1010][11];
int main() { int n,m,T,t=1; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%lf%lf",&pas[i].p,&pas[i].q); sort(pas,pas+n); //mesmet(dp,0,sizeof(dp)); for(int j=0;j<=m;j++)dp[n-1][j]=pas[n-1].p; for(int i=n-2;i>=0;i--) { dp[i][0]=pas[i].p+(1-pas[i].p-pas[i].q)*dp[i+1][0]; for(int j=1;j<=m;j++) { dp[i][j]=pas[i].p+pas[i].q*dp[i+1][j-1]+(1-pas[i].p-pas[i].q)*dp[i+1][j]; } } printf("Case %d: %.5f\n",t++,dp[0][m]); } return 0; }
|
|
常用链接
随笔分类
Links
搜索
最新评论
|
|