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. 手动导出Excel方法

    private void dgJiBingZhenDuanBind() {   Response.Clear(); Response.Charset = "GB2312"; Res ...

  2. MonkeyRunner学习(3)脚本编辑

    除了cmd直接操作手机,也可以编辑好脚本后,运行脚本,一次操作多个脚本命令 a) 新建py格式脚本,如iReader.py b) 编辑脚本 #导入模块 from com.android.monkeyr ...

  3. 2年后的Delphi XE6

    1.有幸下载到Delphi XE6,下载地址如下: http://altd.embarcadero.com/download/radstudio/xe6/delphicbuilder_xe6_win. ...

  4. (Clob的写入和读取-java)更新数据库报错:SQL Error: 1461, SQLState: 72000 ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

    原 因:某一个字段本为varchar2(1024),但是实际要插入的值超过varchar2允许的最大长度4000时,oracle自动将该字段值转化为Long类型,然后提示插入操作失败. 解决办法: 1 ...

  5. 转!!Java中关于Null的9个解释(Java Null详解)

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  6. phalcon: model 验证数据完整性

    The above example performs a validation using the built-in validator “InclusionIn”. It checks the va ...

  7. 机器学习与R语言

    此书网上有英文电子版:Machine Learning with R - Second Edition [eBook].pdf(附带源码) 评价本书:入门级的好书,介绍了多种机器学习方法,全部用R相关 ...

  8. dom4j如何解析xml

    简单解析自己定义的xml文件,首先,给解析xml文件的类来个构造方法: public xmlData(File xmlFile) { file = xmlFile; try { saxReader = ...

  9. 如何在腾讯云上开发一款O2O书签?

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

  10. Linux下修改系统时间并写入BIOS

    我们一般使用“date -s”命令来修改系统时间.比如将系统时间设定成2005年7月26日的命令如下. #date -s 07/26/2005 将系统时间设定成下午11点12分0秒的命令如下. #da ...