【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      
原文地址:https://www.cnblogs.com/myx12345/p/9751216.html