zoukankan      html  css  js  c++  java
  • 【HDOJ6224】Legends of the Three Kingdoms(概率DP)

    题意:三国杀,给定4个白板武将的血量,4个角色轮流行动,每回合行动时如果该人存活则可以选择使阵营不同的角色血量-1,血量为0则死亡。每个人按自己获胜概率最大化行动,如果有多种方案概率相同则等概率选择这些策略,问最后主公、反贼、内奸三个阵营分别获胜的概率

    0 < h1 < 40, 0 ≤ h2 < 40, 0 ≤ h3 < 40, 0 ≤ h4 < 40

    思路:当前的决策与概率只与血量和当前行动的人有关

    注意行动顺序是主公,反贼,忠臣,内奸

    其他的具体看代码注释吧

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<string>
      4 #include<cmath>
      5 #include<iostream>
      6 #include<algorithm>
      7 #include<map>
      8 #include<set>
      9 #include<queue>
     10 #include<vector>
     11 using namespace std;
     12 typedef long long ll;
     13 typedef unsigned int uint;
     14 typedef unsigned long long ull;
     15 typedef pair<int,int> PII;
     16 typedef vector<int> VI;
     17 #define fi first
     18 #define se second 
     19 #define MP make_pair
     20 #define N   11000
     21 #define M   41
     22 #define MOD 1e9+7
     23 #define eps 1e-13
     24 #define pi acos(-1)
     25 
     26 double dp[40][40][40][40][4][3];
     27 bool vis[40][40][40][40][4];
     28 
     29 int read()
     30 { 
     31    int v=0,f=1;
     32    char c=getchar();
     33    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
     34    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
     35    return v*f;
     36 }
     37 
     38 void dfs(int a,int b,int c,int d,int i)
     39 {
     40     if(vis[a][b][c][d][i]) return;
     41     
     42     vis[a][b][c][d][i]=1;
     43     
     44     if(!c&&!d)    //Both of the Rebel and the Traitor are dead
     45     {
     46         dp[a][b][c][d][i][0]=1.0;
     47         dp[a][b][c][d][i][1]=dp[a][b][c][d][i][2]=0.0; 
     48         return;     //Monarch and the Minister win 
     49     }
     50     
     51     if(!a)    //The Monarch is dead
     52     {
     53         if(a+b+c==0)    //If the Traitor is surviving and all the other players are dead
     54         {
     55             dp[a][b][c][d][i][2]=1.0;
     56             dp[a][b][c][d][i][0]=dp[a][b][c][d][i][1]=0.0; 
     57             return; //the Traitor wins
     58         }
     59          else
     60          {
     61              dp[a][b][c][d][i][1]=1.0;
     62              dp[a][b][c][d][i][0]=dp[a][b][c][d][i][2]=0.0;    
     63              return;    //the Rebel wins
     64          }
     65     }
     66     
     67     if(i==0&&a==0||i==1&&c==0||i==2&&b==0||i==3&&d==0)         //deadman turn 
     68     {
     69         dfs(a,b,c,d,(i+1)%4);
     70         for(int j=0;j<=2;j++) dp[a][b][c][d][i][j]=dp[a][b][c][d][(i+1)%4][j];
     71         return;
     72     }
     73 
     74     int j=(i+1)%4;
     75     double s1=0.0;
     76     double s2=0.0;
     77     double s3=0.0;
     78     int x=0;
     79     
     80     if(i==0||i==2)    //Monarch and the Minister
     81     {
     82         double t=-1.0;
     83         
     84         if(c)
     85         {
     86             dfs(a,b,c-1,d,j);
     87             double k=dp[a][b][c-1][d][j][0];
     88             
     89             if(k-t>eps)
     90             {
     91                 x=1; 
     92                 t=k;
     93                 s1=dp[a][b][c-1][d][j][0];
     94                 s2=dp[a][b][c-1][d][j][1];
     95                 s3=dp[a][b][c-1][d][j][2];
     96             }
     97             else
     98             if(fabs(k-t)<eps)
     99             {
    100                 x++;
    101                 s1+=dp[a][b][c-1][d][j][0];
    102                 s2+=dp[a][b][c-1][d][j][1];
    103                 s3+=dp[a][b][c-1][d][j][2];
    104             }
    105         }
    106         
    107         if(d)
    108         {
    109             dfs(a,b,c,d-1,j);
    110             double k=dp[a][b][c][d-1][j][0];
    111             
    112             if(k-t>eps)
    113             {
    114                 x=1; 
    115                 t=k;
    116                 s1=dp[a][b][c][d-1][j][0];
    117                 s2=dp[a][b][c][d-1][j][1];
    118                 s3=dp[a][b][c][d-1][j][2];
    119             }
    120             else
    121             if(fabs(k-t)<eps)
    122             {
    123                 x++;
    124                 s1+=dp[a][b][c][d-1][j][0];
    125                 s2+=dp[a][b][c][d-1][j][1];
    126                 s3+=dp[a][b][c][d-1][j][2];
    127             }
    128         }
    129     }
    130     
    131     
    132     if(i==1)    //Rebel
    133     {
    134         double t=-1.0;
    135         
    136         if(a)
    137         {
    138             dfs(a-1,b,c,d,j);
    139             double k=dp[a-1][b][c][d][j][1];
    140             
    141             if(k-t>eps)
    142             {
    143                 x=1; 
    144                 t=k;
    145                 s1=dp[a-1][b][c][d][j][0];
    146                 s2=dp[a-1][b][c][d][j][1];
    147                 s3=dp[a-1][b][c][d][j][2];
    148             }
    149             else
    150             if(fabs(k-t)<eps)
    151             {
    152                 x++;
    153                 s1+=dp[a-1][b][c][d][j][0];
    154                 s2+=dp[a-1][b][c][d][j][1];
    155                 s3+=dp[a-1][b][c][d][j][2];
    156             }
    157         }
    158         
    159         if(b)
    160         {
    161             dfs(a,b-1,c,d,j);
    162             double k=dp[a][b-1][c][d][j][1];
    163             
    164             if(k-t>eps)
    165             {
    166                 x=1; 
    167                 t=k;
    168                 s1=dp[a][b-1][c][d][j][0];
    169                 s2=dp[a][b-1][c][d][j][1];
    170                 s3=dp[a][b-1][c][d][j][2];
    171             }
    172             else
    173             if(fabs(k-t)<eps)
    174             {
    175                 x++;
    176                 s1+=dp[a][b-1][c][d][j][0];
    177                 s2+=dp[a][b-1][c][d][j][1];
    178                 s3+=dp[a][b-1][c][d][j][2];
    179             }
    180         }
    181         
    182         if(d)
    183         {
    184             dfs(a,b,c,d-1,j);
    185             double k=dp[a][b][c][d-1][j][1];
    186             
    187             if(k-t>eps)
    188             {
    189                 x=1; 
    190                 t=k;
    191                 s1=dp[a][b][c][d-1][j][0];
    192                 s2=dp[a][b][c][d-1][j][1];
    193                 s3=dp[a][b][c][d-1][j][2];
    194             }
    195             else
    196             if(fabs(k-t)<eps)
    197             {
    198                 x++;
    199                 s1+=dp[a][b][c][d-1][j][0];
    200                 s2+=dp[a][b][c][d-1][j][1];
    201                 s3+=dp[a][b][c][d-1][j][2];
    202             }
    203         }
    204     }
    205     
    206     if(i==3)    //Traitor
    207     {
    208         double t=-1.0;
    209         
    210         if(a)
    211         {
    212             dfs(a-1,b,c,d,j);
    213             double k=dp[a-1][b][c][d][j][2];
    214             
    215             if(k-t>eps)
    216             {
    217                 x=1; 
    218                 t=k;
    219                 s1=dp[a-1][b][c][d][j][0];
    220                 s2=dp[a-1][b][c][d][j][1];
    221                 s3=dp[a-1][b][c][d][j][2];
    222             }
    223             else
    224             if(fabs(k-t)<eps)
    225             {
    226                 x++;
    227                 s1+=dp[a-1][b][c][d][j][0];
    228                 s2+=dp[a-1][b][c][d][j][1];
    229                 s3+=dp[a-1][b][c][d][j][2];
    230             }
    231         }
    232         
    233         if(b)
    234         {
    235             dfs(a,b-1,c,d,j);
    236             double k=dp[a][b-1][c][d][j][2];
    237             
    238             if(k-t>eps)
    239             {
    240                 x=1; 
    241                 t=k;
    242                 s1=dp[a][b-1][c][d][j][0];
    243                 s2=dp[a][b-1][c][d][j][1];
    244                 s3=dp[a][b-1][c][d][j][2];
    245             }
    246             else
    247             if(fabs(k-t)<eps)
    248             {
    249                 x++;
    250                 s1+=dp[a][b-1][c][d][j][0];
    251                 s2+=dp[a][b-1][c][d][j][1];
    252                 s3+=dp[a][b-1][c][d][j][2];
    253             }
    254         }
    255         
    256         if(c)
    257         {
    258             dfs(a,b,c-1,d,j);
    259             double k=dp[a][b][c-1][d][j][2];
    260             
    261             if(k-t>eps)
    262             {
    263                 x=1; 
    264                 t=k;
    265                 s1=dp[a][b][c-1][d][j][0];
    266                 s2=dp[a][b][c-1][d][j][1];
    267                 s3=dp[a][b][c-1][d][j][2];
    268             }
    269             else
    270             if(fabs(k-t)<eps)
    271             {
    272                 x++;
    273                 s1+=dp[a][b][c-1][d][j][0];
    274                 s2+=dp[a][b][c-1][d][j][1];
    275                 s3+=dp[a][b][c-1][d][j][2];
    276             }
    277         }
    278     }
    279     
    280     dp[a][b][c][d][i][0]=s1/x;
    281     dp[a][b][c][d][i][1]=s2/x;
    282     dp[a][b][c][d][i][2]=s3/x;
    283     //printf("%d %d %d %d %d %.3lf %.3lf %.3lf
    ",a,b,c,d,i,dp[a][b][c][d][i][0],dp[a][b][c][d][i][1],dp[a][b][c][d][i][2]);
    284 }
    285 
    286 int main()
    287 {
    288     freopen("hdoj6224.in","r",stdin);
    289     freopen("hdoj6224.out","w",stdout);
    290     int cas;
    291     scanf("%d",&cas);
    292 
    293     memset(vis,0,sizeof(vis));
    294     
    295     while(cas--)
    296     {
    297         int A,B,C,D;
    298          scanf("%d%d%d%d",&A,&B,&C,&D);
    299          dfs(A,B,C,D,0);
    300          printf("%.6lf %.6lf %.6lf
    ",dp[A][B][C][D][0][0],dp[A][B][C][D][0][1],dp[A][B][C][D][0][2]);
    301     }
    302     return 0;
    303 }
    304      
  • 相关阅读:
    SAP GUI中按F1后显示的帮助窗口为空白
    SAP事务代码之IMG设置
    RFC 同步异步调用实例
    SAP R/3 与其他异构系统集成时是否需要应用 SAP XI
    SAP 用户管理事务代码
    SAP 模块中文解释
    SAP Table 类型
    SAP System Tables
    开发SAP的语言
    IDOC 创建,增强,管理,配置
  • 原文地址:https://www.cnblogs.com/myx12345/p/9751216.html
Copyright © 2011-2022 走看看