2017 ICPC乌鲁木齐 A Coins 概率dp

Coins

题意:一开始所有n个硬币都是反面朝上的,每次必须拿k个来抛,抛的人足够聪明,问m次之后向上的硬币的期望。

首先说了这个足够聪明的意思,就是只要向反面的有k个就不会sb地去拿向正面的来抛,想了一会之后就觉得是个概率dp的转移,

然而一开始想漏了个组合数的加权,但在+1的提醒下搞通了,但是分析了下,这是nmk的时间复杂度,

1e6还有个1e3的大T,emmm理论上会TLE的,但结果看网上题解,都是跟自己思路差不多,所以也是很迷。

嗯,转移过程其实很简单,dp[i][j]就是第i次抛了之后j个硬币向上的概率,所以如果n-j>=k很明显,这是全部拿向反面的来抛就行,那么dp[i+1][j+kk]=dp[i][j]*0.5的k次方*k个里面有kk个向正面的组合数

而n-j<的话,那么就得那一些向正面的来抛了,剩下的正面的就j-(k-(n-j))也就是n-k个,那么dp[i+1][n-k+kk]=dp[i][j]*0.5的k次方*k个里面有kk个向正面的组合数

 1 #include<cstdio>
 2 const int N=111;
 3 double cf05[N],c[N][N],dp[N][N];
 4 void init(){
 5     for(int i=0;i<=100;i++){
 6         c[i][0]=1.0;
 7         for(int j=1;j<=i;j++){
 8             if(j<=i/2) c[i][j]=c[i-1][j-1]+c[i-1][j];
 9             else c[i][j]=c[i][i-j];
10         }
11     }
12     cf05[0]=1.0;
13     for(int i=1;i<=100;i++) cf05[i]=cf05[i-1]*0.5;
14 }
15 int main(){
16     init();
17     int t,n,m,k;
18     scanf("%d",&t);
19     while(t--){
20         scanf("%d%d%d",&n,&m,&k);
21         for(int i=0;i<=m;i++)
22             for(int j=0;j<=n;j++) dp[i][j]=0.0;
23         dp[0][0]=1.0;
24         for(int i=0;i<m;i++){
25             for(int j=0;j<=n;j++){
26                 if(dp[i][j]==0.0) continue;
27                 for(int kk=0;kk<=k;kk++){
28                     if(n-j>=k) dp[i+1][j+kk]+=dp[i][j]*cf05[k]*c[k][kk];
29                     else dp[i+1][n-k+kk]+=dp[i][j]*cf05[k]*c[k][kk];
30                 }
31             }
32         }
33         double ans=0.0;
34         for(int i=0;i<=n;i++) ans+=dp[m][i]*i;
35         printf("%.3f\n",ans);
36     }
37     return 0;
38 }

怪怪的哦

原文地址:https://www.cnblogs.com/LMCC1108/p/11638497.html

时间: 2024-11-13 15:06:30

2017 ICPC乌鲁木齐 A Coins 概率dp的相关文章

概率DP 2017 ICPC 乌鲁木齐 A Coins

题目链接:https://nanti.jisuanke.com/t/40512 题意:n个硬币,初始全是反面朝上,抛m次,每次抛k个,求最好情况硬币向上个数的期望 一个比较好的概率DP的总结:https://blog.csdn.net/myjs999/article/details/81022546 分析:很明显当硬币反面朝上次数大于k,直接抛这些,小于k时,这些反面朝上全部取的,不够的加正面朝上的,dp[i][j]表示抛i次后正面朝上有j个的概率,枚举每次抛的硬币里面正面朝上有t个,状态转移方

2017 ICPC Asia Urumqi A.coins (概率DP + 期望)

题目链接:Coins Description Alice and Bob are playing a simple game. They line up a row of nn identical coins, all with the heads facing down onto the table and the tails upward. For exactly mm times they select any kk of the coins and toss them into the

atcoderI - Coins ( 概率DP)

I - Coins Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement Let NN be a positive odd number. There are NN coins, numbered 1,2,…,N1,2,…,N. For each ii (1≤i≤N1≤i≤N), when Coin ii is tossed, it comes up heads with probabi

HDU5985 Lucky Coins 概率dp

题意:给你N种硬币,每种硬币有Si个,有Pi 概率朝上,每次抛所有硬币抛起,所有反面的拿掉,问每种硬币成为最后的lucky硬币的概率. 题解:都知道是概率dp,但是模拟赛时思路非常模糊,很纠结,dp[10][1e6]这个状态让我觉得丝毫没有用,当时一直以为每种硬币是互相独立的.然后中间吃了个饭,回来又想了很久很久,就是不想看题解,然后发现,这个dp和极限有关,同时状态跟走了几步有极大的关系.否则你初始值根本没法赋,那么显然我猜既然保留6位,肯定当数字小到一定程度时是可以忽略的,也就是进行的次数多

Gym 101606F - Flipping Coins - [概率DP]

题目链接:https://codeforc.es/gym/101606/problem/F 题解: 假设 $f[i][j]$ 表示抛 $i$ 次硬币,有 $j$ 个硬币正面朝上的概率. 所以只有两种挑选硬币的情况: 1.正面硬币数量为 $[0,n-1]$,选择反面硬币抛,则正面硬币数量比原本增加 $1$ 或者不变. 2.正面硬币数量为 $n$,随便选择一个硬币抛,则正面硬币数量比原本减少 $1$ 或者不变. 因此可得状态转移方程: 对于 $j<n$,有 f[i+1][j+1]+=f[i][j]*

欧拉公式 大组合数 2017 ICPC 乌鲁木齐 D Fence Building

题目链接:https://nanti.jisuanke.com/t/40515 题意:给你一个n,让你在圆上找n个点,最多能把圆分成多少个区域. 欧拉公式:R+V-E=2,其中的R,V,E分别是区域数,点数,边数 想分成最多的区域,只需要满足不会有3根线交于一个点就好. 尝试统计总的结点个数A(n),与独立线段(包括圆弧上的n段小弧)的总个数B(n),然后利用欧拉公式就可以得到答案 Ans(n)=B(n)−A(n)+1 这里之所以是加1是因为圆外那个区域我们不算任意四个点,会形成一个交点,并贡献

HDU 5001 Walk 求从任意点出发任意走不经过某个点的概率 概率dp 2014 ACM/ICPC Asia Regional Anshan Online

题意: 给定n个点m条边的无向图 问: 从任意点出发任意走d步,从不经过某个点的概率 dp[i][j]表示从不经过i点的前提下,走了d步到达j点的概率. #include <iostream> #include <cstdio> #include <string.h> #include <queue> #include <vector> #include <algorithm> #include <set> using n

UVALive 6672 Bonus Cards 概率dp

题意呢 就是有两种售票方式 一种是icpc 一种是其他方式 icpc抢票成功的概率是其他方式的2倍…… 这时 一个人出现了 他通过内幕知道了两种抢票方式各有多少人 他想知道自己如果用icpc抢票成功的概率是多少 用acm抢票成功的概率是多少…… 做过不多的概率dp 还在摸索…… dp[i][j]代表第i轮有j个icpc的人已经有票了…… 当然同时i-j个通过其他方式抢票的人也有票了 这就是用同样的函数搜两次的原理…… 优化一次i<=a 一次是把初始化放到for里…… 第一次见这么卡时间的题……

HDU 4050 wolf5x(动态规划-概率DP)

wolf5x Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 402    Accepted Submission(s): 248 Special Judge Problem Description There are n grids in a row. The coordinates of grids are numbered fro