HDU4624 Endless Spin 【最大最小反演】【期望DP】

题目分析:

题目是求$E(MAX_{i=1}^n(ai))$, 它等于$E(\sum_{s \subset S}{(-1)^{|s|-1}*min(s))} = \sum_{s \subset S}{(-1)^{|s|-1}*E(min(s))}$。

那么设计期望DP,令$f[i][j][k]$表示前i个球,可选的区间为j个,球的个数是奇数还是偶数。然后就是要写一个高精度,不一定要真的写,可以yy出一种简便方法。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 55;
 5
 6 int n;
 7
 8 long long f[maxn][maxn*maxn][2];
 9
10 int C(int now){return (now+1)*now/2;}
11
12 struct nb{
13     long long zs;
14     long long xs[160];
15 }ans;
16
17 void cunt(long long alpha,long long beta){
18     ans.zs += alpha/beta;alpha %= beta;
19     for(int i=1;i<=150;i++){
20     alpha*=10;
21     ans.xs[i] += alpha/beta; alpha%=beta;
22     }
23 }
24
25 void work(){
26     f[0][0][0] = 1;
27     for(int i=1;i<=n;i++){
28     for(int j=0;j<=C(i);j++){
29         for(int k=i-1;k>=0;k--){
30         if(C(i-k-1) > j) break;
31         f[i][j][0] += f[k][j-C(i-k-1)][1];
32         f[i][j][1] += f[k][j-C(i-k-1)][0];
33         }
34     }
35     }
36     for(int i=0;i<=150;i++) ans.xs[i] = 0;
37     ans.zs = 0;
38     for(int i=1;i<=n;i++){
39     for(int j=0;j<C(i);j++){
40         cunt(C(n)*(f[i][j][1]-f[i][j][0]),(C(n)-j-C(n-i)));
41     }
42     }
43     /*double exm = 5.123456789;
44     printf("%.0lf\n",exm);
45     printf("%.1lf\n",exm);
46     printf("%.2lf\n",exm);
47     printf("%.3lf\n",exm);
48     printf("%.4lf\n",exm);
49     printf("%.5lf\n",exm);
50     printf("%.6lf\n",exm);
51     printf("%.7lf\n",exm);
52     printf("%.8lf\n",exm);
53     exit(0);*/
54     for(int i=150;i>=1;i--){
55         if(i == 15 && ans.xs[16]>=5)ans.xs[i]++;
56         long long p = ans.xs[i]/10;
57         ans.xs[i] -= p*10; if(ans.xs[i] < 0) p--,ans.xs[i]+=10;
58         ans.xs[i-1] += p;
59     }
60     ans.zs += ans.xs[0];
61     printf("%lld.",ans.zs);
62     for(int i=1;i<=15;i++) printf("%lld",ans.xs[i]);
63     printf("\n");
64 }
65
66 int main(){
67     int T; scanf("%d",&T);
68     while(T--){
69     scanf("%d",&n);
70     memset(f,0,sizeof(f));
71     work();
72     }
73     return 0;
74 }

原文地址:https://www.cnblogs.com/Menhera/p/9545918.html

时间: 2024-11-10 13:31:33

HDU4624 Endless Spin 【最大最小反演】【期望DP】的相关文章

HDU4624 Endless Spin(概率&amp;&amp;dp)

2013年多校的题目,那个时候不太懂怎么做,最近重新拾起来,看了一下出题人当初的解题报告,再结合一下各种情况的理解,终于知道整个大致的做法,这里具体写一下做法. 题意:给你一段长度为[1..n]的白色区间,每次随机的取一个子区间将这个区间涂黑,问整个区间被涂黑时需要的期望次数. 1. 首先要做的是一个题目的转化.如果我定义pi为 恰好i次将区间涂黑的概率,那么显然期望 E= 0*p0+1*p1+2*p2+... 换一种角度看这个公式,其实这个公式可以这么写 E = p1 + p2 + p3 +

hdu4624 Endless Spin (min-max容斥+dp)

min-max容斥: $$max\{a_i\}=\sum\limits_{S}(-1)^{|s|-1}min\{a_i|a_i \in S\}$$ 关于证明,可以把一个数$a$看作是集合$\{1...a\}$,于是max相当于取并集,min相当于取交集,就变成了普通的容斥 然后这道题就可以dp了 然而我一直被卡精度 以下代码大概是对的( 1 #include<bits/stdc++.h> 2 #include<tr1/unordered_map> 3 #define CLR(a,x

【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于是想到了这样的一个

[NOIP2016]换教室 D1 T3 Floyed+期望DP

[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 牛牛预先被安排在教室 ci上课, 而另一节课程在教室 di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出中情.若申请通过,学生

【BZOJ3029】守卫者的挑战 [期望DP]

守卫者的挑战 Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者.如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包. 擂台赛一共有N项挑战,各项挑战依次进行.第i

概率与期望dp相关

概率与期望dp 概率 某个事件A发生的可能性的大小,称之为事件A的概率,记作P(A). 假设某事的所有可能结果有n种,每种结果都是等概率,事件A涵盖其中的m种,那么P(A)=m/n. 例如投掷一枚骰子,点数小于3的概率为2/6=1/3. 如果两个事件A和B所涵盖的结果没有交集,那么P(A或B发生)=P(A)+P(B) 还是掷骰子 P(点数小于3或点数大于4)=2/6+2/6=2/3 如果A和B所涵盖的结果有交集 那么P(A或B发生)=P(A)+P(B)-P(A与B同时发生) P(点数小于3或点数

HDOJ 1145 So you want to be a 2n-aire? 期望DP

期望DP So you want to be a 2n-aire? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 267    Accepted Submission(s): 197 Problem Description The player starts with a prize of $1, and is asked a seq

HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由于得到每张卡片的状态不知道,所以用状态压缩,dp[i] 表示这个状态时,要全部收齐卡片的期望. 由于有可能是什么也没有,所以我们要特殊判断一下.然后就和剩下的就简单了. 另一个方法就是状态压缩+容斥,同样每个状态表示收集的状态,由于每张卡都是独立,所以,每个卡片的期望就是1.0/p,然后要做的就是要去重,既然

Topcoder SRM656div1 250 ( 期望DP )

Problem Statement    Charlie has N pancakes. He wants to serve some of them for breakfast. We will number the pancakes 0 through N-1. For each i, pancake i has width i+1 and deliciousness d[i].Charlie chooses the pancakes he is going to serve using t