hdu-4418-Time travel-高斯+機率dp

來源:互聯網
上載者:User

標籤:class   blog   code   2014   string   os   

把N個點先轉化為2*N-2個點。

比如說把012345轉化成0123454321。

這樣,就可以找出任意兩兩個點之間的關係。

然後根據關係可以得出來一個一元多項式的矩陣。

然後就用高斯消元求出矩陣即可。

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<queue>#include<math.h>using namespace std;#define eps 1e-6#define zero(x) ((fabs(x)<eps?0:x))#define maxn 220double a[maxn][maxn];int g[maxn],cnt;int n,m,st,ed;double p[maxn];int guss(int n){    int r;    for(int i=0;i<n;i++)    {        r=i;        for(int j=i+1;j<n;j++)        {            if(fabs(a[j][i])>fabs(a[r][i]))r=j;        }        if(!zero(a[r][i]))return 0;        if(r!=i){                for(int j=0;j<=n;j++)                    swap(a[i][j],a[r][j]);        }        for(int j=i+1;j<=n;j++)a[i][j]/=a[i][i];        a[i][i]=1.0;        for(int j=0;j<n;j++)        {            if(j==i)continue;            for(int k=i+1;k<=n;k++)            {                a[j][k]-=a[i][k]*a[j][i];            }            a[j][i]=0;        }    }    return 1;}void bfs(){    queue<int>que;    while(!que.empty())que.pop();    que.push(st);    memset(g,-1,sizeof(g));    cnt=0;    g[st]=cnt++;    while(!que.empty())    {        int x=que.front();        que.pop();        for(int i=1;i<=m;i++)        {            if(!zero(p[i]))continue;            int y=(i+x)%n;            if(g[y]==-1)            {                g[y]=cnt++;                que.push(y);            }        }    }}int main(){    int T,d;    scanf("%d",&T);    while(T--)    {        scanf("%d%d%d%d%d",&n,&m,&ed,&st,&d);        for(int i=1;i<=m;i++)        {            scanf("%lf",&p[i]);            p[i]=1.0*p[i]/100.0;        }        if(ed==st)        {            puts("0.00");            continue;        }        n=2*n-2;        if(d==1)st=n-st;        bfs();        if(g[ed]==-1&&g[n-ed]==-1){                puts("Impossible !");                continue;        }        memset(a,0,sizeof(a));        for(int i=0;i<n;i++)        {            if(g[i]==-1)continue;            if(i==ed||i==n-ed)            {                a[g[i]][g[i]]=1;                a[g[i]][cnt]=0;                continue;            }            a[g[i]][g[i]]=1.0;            for(int j=1;j<=m;j++)            {                int y=(i+j)%n;                if(g[y]==-1)continue;                a[g[i]][g[y]]-=p[j];                a[g[i]][cnt]+=1.0*j*p[j];            }        }        if(!guss(cnt))puts("Impossible !");        else printf("%.2lf\n",a[g[st]][cnt]);    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.