HDU 3366 Passage

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3366

题目大意:一个人被困在一个城堡里,面前有n条路,他自己有m百万元,选择每一条路都有p概率通过,q概率遇到士兵,1-p-q概率道路不通;遇到士兵的话需要上交1百万,如果不够钱,则被杀死,问的是最优情况下多少概率可以成功逃脱

一道dp概率,,,场上不会做,赛后补一下吧;

思路:先对数据进行处理,因为要尽早活着离开,所以按照p/q的大小进行排序;

然后列出dp方程。dp【i】【j】代表第i条路还有j百万;

dp【i】【j】*pi表示能直接出去;dp【i】【j】*(1-pi-qi)代表第i条路不通;dp【i+1】【j-1】表示第i条路遇到事并且不被杀死,

dp【i+1】【j-1】=dp【i】【j】*qi;

代码如下:

#include
using namespace std;
struct point
{
    double p;
    double q;
    bool operator <(const point& r )const
    {
        return p/q>r.p/r.q;
    }

} a[1005];
double dp[1005][1005];
int main()
{
    int t;
    scanf("%d",&t);
    for(int z=1; z<=t; z++)
    {
        memset(dp,0,sizeof(dp));
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
            scanf("%lf%lf",&a[i].p,&a[i].q);
        sort(a+1,a+n+1);

        dp[1][m]=1.0;
        double ans=0;
        for(int i=1; i<=n; i++)
            for(int j=m; j>=0; j--)
            {
                dp[i+1][j-1]+=dp[i][j]*a[i].q;
                dp[i+1][j]+=dp[i][j]*(1-a[i].p-a[i].q);
                ans+=dp[i][j]*a[i].p;
            }
        printf("Case %d: %.5lf\n",z,ans);


    }
}

你可能感兴趣的:(概率dp,hdu)