• BZOJ2319 : 黑白棋游戏


    将01串按1分段,那么分析可得长度为$a$的段拼上长度为$b$的段的SG值为$a-[aleq b]$。

    设$f[i][j][k][l]$表示从后往前用了$i$个1,$j$个0,当前段长度为$k$,后面部分SG值为$l$的概率。

    同时预处理出$g[i][j][k]$表示$i$个1,$j$个0的串,SG值为$k$的概率。

    那么对于最终答案,只需要DP出组合游戏的SG值$>0$的概率即可。

    时间复杂度$O(m^4+nm^2)$。

    #include<cstdio>
    const int N=105,M=130;
    const double eps=1e-12;
    int n,ma,mb,o,i,j,k,l,a[N],b[N];double f[2][N][N][N],g[N][N][N],dp[N][M],ans;
    int main(){
      scanf("%d",&n);
      for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]>ma)ma=a[i];
      }
      for(i=1;i<=n;i++){
        scanf("%d",&b[i]);
        if(b[i]>mb)mb=b[i];
      }
      f[1][0][1][0]=f[0][1][1][0]=1;
      for(o=i=0;i<=ma;o^=1,i++){
        if(i)for(j=0;j<=mb;j++)for(k=1;k<=mb+1;k++)for(l=0;l<=mb+1;l++)f[o^1][j][k][l]=0;
        for(j=0;j<=mb;j++)for(k=1;k<=mb+1;k++)for(l=0;l<=mb+1;l++)if(f[o][j][k][l]>eps){
          if(i<ma)f[o^1][j][1][k-(k<=l)]+=f[o][j][k][l]*(i+1)/(i+j+1);
          if(j<mb)f[o][j+1][k+1][l]+=f[o][j][k][l]*(j+1)/(i+j+1);
          g[i][j][k-(k<=l)]+=f[o][j][k][l];
        }
      }
      dp[0][0]=1;
      for(i=1;i<=n;i++)for(j=0;j<M;j++)if(dp[i-1][j]>eps)
        for(k=0;k<=b[i]+1;k++)if(g[a[i]][b[i]][k]>eps)
          dp[i][j^k]+=dp[i-1][j]*g[a[i]][b[i]][k];
      for(i=1;i<M;i++)ans+=dp[n][i];
      return printf("%.6f",ans),0;
    }
    

      

  • 相关阅读:
    python之路----初识面向对象(二)
    python之路----初识面向对象
    python之路----包
    python之路----模块与序列化模块
    python之路----模块调用
    python之路----常用模块二
    Python之路----递归函数
    Python之路----内置函数
    【CSS】整屏大背景
    【PHP】打印输出var_dump+echo+print_r
  • 原文地址:https://www.cnblogs.com/clrs97/p/7675295.html
Copyright © 2020-2023  润新知