• 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
    ",exm);
    45     printf("%.1lf
    ",exm);
    46     printf("%.2lf
    ",exm);
    47     printf("%.3lf
    ",exm);
    48     printf("%.4lf
    ",exm);
    49     printf("%.5lf
    ",exm);
    50     printf("%.6lf
    ",exm);
    51     printf("%.7lf
    ",exm);
    52     printf("%.8lf
    ",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("
    ");
    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 }
  • 相关阅读:
    MFC常用控件使用方法
    用CImage类来显示PNG、JPG等图片
    javascript
    gSoap学习笔记
    Linux增加Swap分区
    nagios 监控shell脚本
    新机器连接老机器遇到的ERROR
    linux下PS1命令提示符设置
    python基础篇之进阶
    mysql不能使用localhost登录
  • 原文地址:https://www.cnblogs.com/Menhera/p/9545918.html
Copyright © 2020-2023  润新知