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<bits/stdc++.h>
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);


    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章