http://poj.org/problem?id=1202

难度集中在输出格式上,因为输出格式所以是高精度

递推式:

血缘肯定只有从双亲传到儿子的,所以,设f,m为双亲,son为儿子,
p[i][j]为i和j之间的血缘关系,p[j][i]=p[i][j]

则:

p[son][f]=p[son][m]=0.5+0.5*p[f][m]

对于兄弟和其他不是双亲的节点j,则有

p[son][j]=0.5*(p[f][j]+p[m][j])

另外:http://swerc.up.pt/2002/Data/有数据

代码交了好几次都是RE,突然交了一次居然AC了

import java.math.BigDecimal;
import java.util.*; class mes{
int son,nxt;
mes(){son=nxt=0;}
}
public class Main {
final static int maxn=650;
static int head[];
static BigDecimal p[][];
static mes s[];
static int fa[][];
static int n,k,m;
static int vis[];
static int que[]; static void addedge(int f,int t,int ind)
{
s[ind].nxt=head[f];
s[ind].son=t;
head[f]=ind;
}
static Scanner scanner;
static void init()
{
for(int i=0;i<maxn;i++){
head[i]=-1;
}
scanner = new Scanner(System.in);
n=scanner.nextInt();
k=scanner.nextInt();
for(int i=0; i<k; i++)
{
int son,f,m;
son=scanner.nextInt();
f=scanner.nextInt();
m=scanner.nextInt();
addedge(f,son,2*i);
addedge(m,son,2*i+1);
fa[son][0]=f;
fa[son][1]=m;
}
for(int i=1; i<=n; i++)
{
p[i][i]=BigDecimal.ONE;
}
} static void calc()
{
int front=0,tail=0;
final BigDecimal mul=BigDecimal.valueOf(0.5);
for(int i=1; i<=n; i++)
{
if(fa[i][0]==0&&fa[i][1]==0&&vis[i]==0)
{
que[tail++]=i;
vis[i]=1;
}
}
while(tail!=front)
{
int tp=que[front];front++;
vis[tp]=2;
int f=fa[tp][0],m=fa[tp][1];
if(f!=0&&m!=0)
{
p[tp][f]=p[tp][m]=p[f][tp]=p[m][tp]=(p[f][m].add(BigDecimal.ONE)).multiply(mul);
for(int i=1; i<=n; i++)
{
if(i!=f&&i!=tp&&i!=m)
{
p[i][tp]=p[i][tp].add((p[i][m].add(p[i][f])).multiply(mul));
p[tp][i]=p[i][tp];
}
}
} for(int sp=head[tp]; sp!=-1; sp=s[sp].nxt)
{
int son=s[sp].son;
if(vis[son]!=0)continue;
if(vis[fa[son][0]]==2&&vis[fa[son][1]]==2)
{
que[tail++]=son;
vis[son]=1;
}
}
}
}
static void show()
{
m=scanner.nextInt();
for(int i=0; i<m; i++)
{
int f,t;
f=scanner.nextInt();
t=scanner.nextInt();
String ans = p[t][f].multiply(BigDecimal.valueOf(100)).toPlainString();
if(ans.indexOf(".")>0&&ans.indexOf(".")<ans.length()){
while(ans.length()>1&&ans.endsWith("0")){
ans=ans.substring(0,ans.length()-1);
}
}
if(ans.endsWith(".")&&ans.length()>1)ans=ans.substring(0,ans.length()-1);
System.out.println(ans+"%");
}
}
public static void main(String[] args) {
head=new int[maxn];
p=new BigDecimal[maxn][maxn];
s=new mes[2*maxn];
fa=new int[maxn][2];
que=new int[maxn];
vis = new int[maxn];
for(int i=0;i<maxn;i++){p[i]=new BigDecimal[maxn];s[i]=new mes();fa[i]=new int[2];}
for(int i=0;i<maxn;i++){for(int j=0;j<maxn;j++){p[i][j]=BigDecimal.ZERO;}}
init();
calc();
show();
}
}

POJ 1202 Family 概率,DP,高精 难度:2的更多相关文章

  1. 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】

    题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...

  2. [CEOI2007]树的匹配Treasury(树形DP+高精)

    题意 给一棵树,你可以匹配有边相连的两个点,问你这棵树的最大匹配时多少,并且计算出有多少种最大匹配. N≤1000,其中40%的数据答案不超过 108 题解 显然的树形DP+高精. 这题是作为考试题考 ...

  3. poj 2096 Collecting Bugs 概率dp 入门经典 难度:1

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 2745   Accepted: 1345 ...

  4. [P1005][NOIP2007] 矩阵取数游戏 (DP+高精)

    我不会高精…… 也不会DP…… 这道题即考高精又考DP…… 我要死了 给一个不是高精的代码(当然不能满分) #include<cstdio> #include<iostream> ...

  5. 矩阵取数问题(dp,高精)

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n×mn \times mn×m的矩阵,矩阵中的每个元素ai,ja_{i,j}ai,j​均为非负整数.游戏规则如下: 每次取数时须从每行各取走 ...

  6. POJ 3156 - Interconnect (概率DP+hash)

    题意:给一个图,有些点之间已经连边,现在给每对点之间加边的概率是相同的,问使得整个图连通,加边条数的期望是多少. 此题可以用概率DP+并查集+hash来做. 用dp(i,j,k...)表示当前的每个联 ...

  7. BZOJ1089 [SCOI2003]严格n元树 【dp + 高精】

    Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...

  8. poj 1322 Chocolate (概率dp)

    ///有c种不同颜色的巧克力.一个个的取.当发现有同样的颜色的就吃掉.去了n个后.到最后还剩m个的概率 ///dp[i][j]表示取了i个还剩j个的概率 ///当m+n为奇时,概率为0 # inclu ...

  9. BZOJ5300 [Cqoi2018]九连环 【dp + 高精】

    题目链接 BZOJ5300 题解 这题真的是很丧病,,卡高精卡到哭 我们设\(f[i]\)表示卸掉前\(i\)个环需要的步数 那么 \[f[i] = 2*f[i - 2] + f[i - 1] + 1 ...

随机推荐

  1. 在SSH框架中使用Spring的好处

    在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句.Struts是用来 ...

  2. activity去标题栏操作&保留高版本主题

    方式一:每个类都需要去添加此代码 在setContentView(R.layout.activity_splash); 前设置以下代码 requestWindowFeature(Window.FEAT ...

  3. [js]事件综合 整理

    原文链接:http://www.cnblogs.com/xxcanghai/p/5205998.html 事件流:页面接收事件的顺序,IE提出了事件冒泡流,Netscape提出了事件捕获流. 事件冒泡 ...

  4. 转:strcmp函数实现及分析

    转自:strcmp函数实现及详解 strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果,函数形式如下:int strcmp(constchar*str1,constcha ...

  5. HashMap详解

    HashMap:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html ConcurrentHashMap:http://ww ...

  6. javascript隐式转换详解

    Javascript是web前端开发的必学技术,今天和大家分享的就是javascript的基础知识隐式转换,希望可以帮助大家更好的学习. 转换成布尔类型假 undefined->falSe nu ...

  7. 在应用中更新App版本

    在应用中, 为了提高用户体验, 会提供更新版本的功能. 那么如何实现呢? 我写了一个简单的Demo, 说明一下, 需要注意几个细节. 使用了Retrofit和Rx处理网络请求. Github下载地址 ...

  8. 腾讯云从零部署nodejs站点

    版权声明:本文由袁飞翔原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/176 来源:腾云阁 https://www.qclo ...

  9. C语言中随机数相关问题

    用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand ...

  10. Windows下Git的安装及配置

    Git的BASH Git的为Windows提供了用于命令行运行的一个仿真BASH的Git.习惯LINUX和UNIX环境的你,可以在该BASH环境中输入“git”命令来完成各种版本控制的操作. 简介 G ...