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. js call与apply的区别-Tom

    .apply和.call方法是在函数原型中定义的两个方法(因此所有的函数都可以访问它)允许去手动设置函数调用的this值,他们用接受 的第一个参数作为this值,this 在调用的作用域中使用.这两个 ...

  2. poj3449Geometric Shapes

    链接 繁琐. 处理出来所有的线段,再判断相交. 对于正方形的已知对角顶点求剩余两顶点 (列出4个方程求解) p[].x=(p[].x+p[].x+p[].y-p[].y)/; p[].y=(p[].y ...

  3. Python学习笔记3—字符串

    原始字符串 使用\转义或者r,这种方法在网站设置网站目录结构的时候非常管用. >>> dos="c:\news" >>> print dos c ...

  4. Linux crontab 定时任务

    http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html 19. crontab 定时任务 通过crontab 命令,我们 ...

  5. SVM(支持向量机)与统计机器学习 & 也说一下KNN算法

    因为SVM和统计机器学习内容很多,所以从 http://www.cnblogs.com/charlesblc/p/6188562.html 这篇文章里面分出来,单独写. 为什么说SVM和统计学关系很大 ...

  6. Java后端开发

    Java后端开发 名称 内容 基本框架 Spring.Mybatis Linux服务器   数据库优化   消息服务 rabbitMQ.activeMq rocketMq 缓存服务 memcached ...

  7. GIT过滤

    git 创建 .gitignore 文件 建立项目过滤规则 创建 .gitignore 随意设置想跟踪哪些文件 和不跟踪哪些文件. 1.在项目根目录下建立 .gitignore 文件 2.   .gi ...

  8. RMAN-03009 ORA-19504 ORA-27038

    错误信息如下: RMAN> backup database tag='full20160112' format '/orabak/rman/full20160112' include curre ...

  9. linux下tftp安装与设置

    在学习linux+arm开发的时候,tftp和NFS是必不可少的环境.这里总结一下自己安装和使用tftp的一些经验,做个备忘. 一.tftp服务原理 tftp(trivial file transfe ...

  10. 使用ICMP协议Ping网络主机

    #coding:utf-8 #!/usr/bin/env python import os import argparse import socket import struct import sel ...