码迷,mamicode.com
首页 > 其他好文 > 详细

期望DP

时间:2016-05-12 01:17:26      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:

BZOJ 1415

技术分享
 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cstdio>
 5 using namespace std;
 6 const int Maxn=1010;
 7 int t[Maxn],n,m,S,T,now,p[Maxn][Maxn],head[Maxn],dis[Maxn],u,v,cnt;
 8 double f[Maxn][Maxn];
 9 struct EDGE
10 {
11     int to,next;
12 }edge[Maxn<<2];
13 inline void Add(int u,int v)
14 {edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
15 void Dfs(int u,int top)
16 {
17     for (int i=head[u];i!=-1;i=edge[i].next)
18         if (dis[edge[i].to]==-1 || dis[edge[i].to]>dis[u]+1 || (dis[edge[i].to]==dis[u]+1 && p[now][edge[i].to]>top))
19         {
20             dis[edge[i].to]=dis[u]+1;
21             p[now][edge[i].to]=top;
22             Dfs(edge[i].to,top);
23         }
24 }
25 double F(int S,int T)
26 {
27     if (f[S][T]!=0) return f[S][T];
28     if (S==T) return 0;
29     if (p[p[S][T]][T]==T || p[S][T]==T) return 1;
30     double res=0;
31     for (int i=head[T];i!=-1;i=edge[i].next)
32         res+=F(p[p[S][T]][T],edge[i].to);
33     res+=F(p[p[S][T]][T],T); 
34     res/=(double)(t[T]+1.0);
35     res+=1;
36     return f[S][T]=res;
37 }
38 int main()
39 {
40     scanf("%d%d",&n,&m);
41     scanf("%d%d",&S,&T);
42     memset(head,-1,sizeof(head));
43     for (int i=1;i<=m;i++)
44     {
45         scanf("%d%d",&u,&v);
46         Add(u,v),Add(v,u);
47         t[u]++; t[v]++;
48     }
49      
50     for (int i=1;i<=n;i++) 
51     {
52         memset(dis,-1,sizeof(dis));
53         dis[i]=0;
54         for (int j=head[i];j!=-1;j=edge[j].next)
55         {
56             now=i;
57             dis[edge[j].to]=1;
58             Dfs(edge[j].to,edge[j].to);
59         }
60         for (int j=head[i];j!=-1;j=edge[j].next) p[i][edge[j].to]=edge[j].to;
61     }
62     printf("%.3lf\n",F(S,T));
63     return 0;
64 }
C++

BZOJ 1419

技术分享
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 const int Maxn=5010;
 7 double f[3][Maxn];
 8 int R,B,cur;
 9 inline double Max(double x,double y) {return x>y?x:y;}
10 int main()
11 {
12     scanf("%d%d",&R,&B);
13     for (int i=1;i<=R;i++)
14     {
15         cur^=1;
16         for (int j=0;j<=B;j++)
17         {
18             if (i==0) {f[cur][j]=0; continue;}
19             if (j==0) {f[cur][j]=f[cur^1][j]+1;continue;}
20             f[cur][j]=Max(0,(f[cur^1][j]+1.0)*((double)(i)/(double)(i+j))+(f[cur][j-1]-1.0)*((double)(j)/(double)(i+j)));
21  
22         }
23     }
24     printf("%.6lf\n",f[cur][B]-5e-7);
25     return 0;
26 }
C++

算法合集之《浅析竞赛中一类数学期望问题的解决方法》中有对题目的讲解。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int Maxn=1010;
int t[Maxn],n,m,S,T,now,p[Maxn][Maxn],head[Maxn],dis[Maxn],u,v,cnt;
double f[Maxn][Maxn];
struct EDGE
{
    int to,next;
}edge[Maxn<<2];
inline void Add(int u,int v)
{edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
void Dfs(int u,int top)
{
    for (int i=head[u];i!=-1;i=edge[i].next)
        if (dis[edge[i].to]==-1 || dis[edge[i].to]>dis[u]+1 || (dis[edge[i].to]==dis[u]+1 && p[now][edge[i].to]>top))
        {
            dis[edge[i].to]=dis[u]+1;
            p[now][edge[i].to]=top;
            Dfs(edge[i].to,top);
        }
}
double F(int S,int T)
{
    if (f[S][T]!=0) return f[S][T];
    if (S==T) return 0;
    if (p[p[S][T]][T]==T || p[S][T]==T) return 1;
    double res=0;
    for (int i=head[T];i!=-1;i=edge[i].next)
        res+=F(p[p[S][T]][T],edge[i].to);
    res+=F(p[p[S][T]][T],T);
    res/=(double)(t[T]+1.0);
    res+=1;
    return f[S][T]=res;
}
int main()
{
    scanf("%d%d",&n,&m);
    scanf("%d%d",&S,&T);
    memset(head,-1,sizeof(head));
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        Add(u,v),Add(v,u);
        t[u]++; t[v]++;
    }
     
    for (int i=1;i<=n;i++)
    {
        memset(dis,-1,sizeof(dis));
        dis[i]=0;
        for (int j=head[i];j!=-1;j=edge[j].next)
        {
            now=i;
            dis[edge[j].to]=1;
            Dfs(edge[j].to,edge[j].to);
        }
        for (int j=head[i];j!=-1;j=edge[j].next) p[i][edge[j].to]=edge[j].to;
    }
    printf("%.3lf\n",F(S,T));
    return 0;
}

期望DP

标签:

原文地址:http://www.cnblogs.com/yyjxx2010xyu/p/5484111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!