zoukankan      html  css  js  c++  java
  • Codeforces 678E:Another Sith Tournament 状压DP

    odd-even number 

    题目链接:

    http://codeforces.com/problemset/problem/678/E

    题意:

    有n个人打擂台赛,每两个人间都有相对的胜率,主角可以操控比赛顺序,求主角最后获胜的最大概率。

    题解:

    设dp[i][j]为状态 i (二进制位代表出场选手) j 号选手第一个上场时主角的最大胜率,dp[1][0]=1.0(场上只有主角一个人主角必胜)。

    状态转移方程dp[i][j]=max(dp[i][j],dp[i^(1<<j)][k]*p[k][j]+dp[i^(1<<k)][j]*p[j][k]);

    代码

    #include<stdio.h>
    #include<string.h>
    const int N=18;
    double dp[1<<N][N],p[N][N];
    double mmax(double x,double y)
    {
      return x>y?x:y;
    }
    void solve()
    {
      int n;
      memset(dp,0,sizeof(dp));
      scanf("%d",&n);
      for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
          scanf("%lf",&p[i][j]);
      dp[1][0]=1.0;
      for(int i=0;i<(1<<n);++i)
        for(int j=0;j<n;++j)
          if((i&(1<<j)))
            for(int k=0;k<n;++k)
              if((i&(1<<k))&&j!=k)
                dp[i][j]=mmax(dp[i][j],dp[i^(1<<j)][k]*p[k][j]+dp[i^(1<<k)][j]*p[j][k]);
      double ans=0.0;
      for(int i=0;i<n;++i)
        if(dp[(1<<n)-1][i]>ans)ans=dp[(1<<n)-1][i];
      printf("%.8f ",ans);
    }
    int main()
    {
      solve();
      return 0;
    }

  • 相关阅读:
    类(抽象类与非抽象类)和接口
    Arduino学习——u8glib提供的字体样式
    Arduino学习——u8glib库资料整理
    Arduino学习——Arduino main 函数
    全局变量的初始化
    nmake学习笔记2
    Big Endian与Litter Endian
    nmake学习笔记
    重载操作符
    offsetof的意义
  • 原文地址:https://www.cnblogs.com/kiuhghcsc/p/5950266.html
Copyright © 2011-2022 走看看