2017 ICPC Shenyang H - Legends of the Three Kingdoms

只有恶心人的大模拟才会让懒人写博客。。。

挂着概率DP名字的模拟(

很容易想到dp[i][j][k][l][t][0,1,2]表示主公忠臣反贼内奸的血量,轮到t行动,三方势力分别的胜率

转移过程比较繁琐,看到网上基本上是DFS写的。这里提供一个循环的写法。

特别注意:这道题目一定要输出6位。

代码如下:

  1 #include<iostream>
  2 #include<stdio.h>
  3 using namespace std;
  4 double dp[40][40][40][40][4][3],maxx;
  5 int i,j,k,l,cnt,h1,h2,h3,h4,tt,t;
  6 int main()
  7 {
  8     //主公忠臣胜利
  9     for (i=1;i<40;i++)
 10     {
 11         for (j=0;j<40;j++)
 12         {
 13             for (t=0;t<4;t++)
 14             {
 15                 dp[i][j][0][0][t][0]=1;
 16                 dp[i][j][0][0][t][1]=0;
 17                 dp[i][j][0][0][t][2]=0;
 18             }
 19         }
 20     }
 21     //反贼胜利
 22     for (j=0;j<40;j++)
 23     for (k=0;k<40;k++)
 24     for (l=0;l<40;l++)
 25     for (t=0;t<4;t++)
 26     {
 27         dp[0][j][k][l][t][0]=0;
 28         dp[0][j][k][l][t][1]=1;
 29         dp[0][j][k][l][t][2]=0;
 30     }
 31     //内奸胜利 
 32     for (l=1;l<40;l++)
 33     {
 34         for (t=0;t<4;t++)
 35         {
 36             dp[0][0][0][l][t][0]=0;
 37             dp[0][0][0][l][t][1]=0;
 38             dp[0][0][0][l][t][2]=1;
 39         }
 40     }
 41     for (i=0;i<40;i++)
 42     for (j=0;j<40;j++)
 43     for (k=0;k<40;k++)
 44     for (l=0;l<40;l++)
 45     {
 46         if (((i==0)+(j==0)+(k==0)+(l==0))>=3) continue;
 47         if (i==0) continue;
 48         if (k+l==0) continue;
 49         //t=0;
 50         if (k>0)     
 51         {
 52             dp[i][j][k][l][0][0]=dp[i][j][k-1][l][1][0];                
 53             dp[i][j][k][l][0][1]=dp[i][j][k-1][l][1][1];
 54             dp[i][j][k][l][0][2]=dp[i][j][k-1][l][1][2];
 55         }
 56         if (l>0)
 57         {
 58             if (k<=0||dp[i][j][k][l-1][1][0]>dp[i][j][k][l][0][0])
 59             {
 60                 dp[i][j][k][l][0][0]=dp[i][j][k][l-1][1][0];
 61                 dp[i][j][k][l][0][1]=dp[i][j][k][l-1][1][1];
 62                 dp[i][j][k][l][0][2]=dp[i][j][k][l-1][1][2];
 63             }
 64             else if (k>0&&dp[i][j][k][l-1][1][0]==dp[i][j][k][l][0][0])
 65             {
 66                 dp[i][j][k][l][0][0]=(dp[i][j][k][l-1][1][0]+dp[i][j][k][l][0][0])/2;
 67                 dp[i][j][k][l][0][1]=(dp[i][j][k][l-1][1][1]+dp[i][j][k][l][0][1])/2;
 68                 dp[i][j][k][l][0][2]=(dp[i][j][k][l-1][1][2]+dp[i][j][k][l][0][2])/2;
 69             }
 70         }
 71         //t=3;
 72         if (l==0)
 73         {
 74             dp[i][j][k][l][3][0]=dp[i][j][k][l][0][0];
 75             dp[i][j][k][l][3][1]=dp[i][j][k][l][0][1];
 76             dp[i][j][k][l][3][2]=dp[i][j][k][l][0][2];
 77         }
 78         else
 79         {
 80             maxx=0;
 81             cnt=0;
 82             if (i>0) if (dp[i-1][j][k][l][0][2]>maxx) maxx=dp[i-1][j][k][l][0][2];
 83             if (j>0) if (dp[i][j-1][k][l][0][2]>maxx) maxx=dp[i][j-1][k][l][0][2];
 84             if (k>0) if (dp[i][j][k-1][l][0][2]>maxx) maxx=dp[i][j][k-1][l][0][2];
 85             if (i>0) if (dp[i-1][j][k][l][0][2]==maxx) 
 86             {
 87                 cnt++;
 88                 dp[i][j][k][l][3][0]+=dp[i-1][j][k][l][0][0];
 89                 dp[i][j][k][l][3][1]+=dp[i-1][j][k][l][0][1];
 90                 dp[i][j][k][l][3][2]+=dp[i-1][j][k][l][0][2];
 91             }
 92             if (j>0) if (dp[i][j-1][k][l][0][2]==maxx) 
 93             {
 94                 cnt++;
 95                 dp[i][j][k][l][3][0]+=dp[i][j-1][k][l][0][0];
 96                 dp[i][j][k][l][3][1]+=dp[i][j-1][k][l][0][1];
 97                 dp[i][j][k][l][3][2]+=dp[i][j-1][k][l][0][2];
 98             }
 99             if (k>0) if (dp[i][j][k-1][l][0][2]==maxx) 
100             {
101                 cnt++;
102                 dp[i][j][k][l][3][0]+=dp[i][j][k-1][l][0][0];
103                 dp[i][j][k][l][3][1]+=dp[i][j][k-1][l][0][1];
104                 dp[i][j][k][l][3][2]+=dp[i][j][k-1][l][0][2];
105             }
106             dp[i][j][k][l][3][0]=dp[i][j][k][l][3][0]/cnt;
107             dp[i][j][k][l][3][1]=dp[i][j][k][l][3][1]/cnt;
108             dp[i][j][k][l][3][2]=dp[i][j][k][l][3][2]/cnt;
109         }
110         //t=2;
111         if (j==0)
112         {
113             dp[i][j][k][l][2][0]=dp[i][j][k][l][3][0];
114             dp[i][j][k][l][2][1]=dp[i][j][k][l][3][1];
115             dp[i][j][k][l][2][2]=dp[i][j][k][l][3][2];
116         }
117         else
118         {
119             if (k>0)     
120             {
121                 dp[i][j][k][l][2][0]=dp[i][j][k-1][l][3][0];                
122                 dp[i][j][k][l][2][1]=dp[i][j][k-1][l][3][1];
123                 dp[i][j][k][l][2][2]=dp[i][j][k-1][l][3][2];
124             }
125             if (l>0)
126             {
127                 if (k<=0||dp[i][j][k][l-1][3][0]>dp[i][j][k][l][2][0])
128                 {
129                     dp[i][j][k][l][2][0]=dp[i][j][k][l-1][3][0];
130                     dp[i][j][k][l][2][1]=dp[i][j][k][l-1][3][1];
131                     dp[i][j][k][l][2][2]=dp[i][j][k][l-1][3][2];
132                 }
133                 else if (k>0&&dp[i][j][k][l-1][3][0]==dp[i][j][k][l][2][0])
134                 {
135                     dp[i][j][k][l][2][0]=(dp[i][j][k][l-1][3][0]+dp[i][j][k][l][2][0])/2;
136                     dp[i][j][k][l][2][1]=(dp[i][j][k][l-1][3][1]+dp[i][j][k][l][2][1])/2;
137                     dp[i][j][k][l][2][2]=(dp[i][j][k][l-1][3][2]+dp[i][j][k][l][2][2])/2;
138                 }
139             }
140         }
141         //t=1;
142         if (k==0)
143         {
144             dp[i][j][k][l][1][0]=dp[i][j][k][l][2][0];
145             dp[i][j][k][l][1][1]=dp[i][j][k][l][2][1];
146             dp[i][j][k][l][1][2]=dp[i][j][k][l][2][2];
147         }
148         else
149         {
150             maxx=0;
151             cnt=0;
152             if (i>0) if (dp[i-1][j][k][l][2][1]>maxx) maxx=dp[i-1][j][k][l][2][1];
153             if (j>0) if (dp[i][j-1][k][l][2][1]>maxx) maxx=dp[i][j-1][k][l][2][1];
154             if (l>0) if (dp[i][j][k][l-1][2][1]>maxx) maxx=dp[i][j][k][l-1][2][1];
155             if (i>0) if (dp[i-1][j][k][l][2][1]==maxx)
156             {
157                 cnt++;
158                 dp[i][j][k][l][1][0]+=dp[i-1][j][k][l][2][0];
159                 dp[i][j][k][l][1][1]+=dp[i-1][j][k][l][2][1];
160                 dp[i][j][k][l][1][2]+=dp[i-1][j][k][l][2][2];
161             }
162             if (j>0) if (dp[i][j-1][k][l][2][1]==maxx)
163             {
164                 cnt++;
165                 dp[i][j][k][l][1][0]+=dp[i][j-1][k][l][2][0];
166                 dp[i][j][k][l][1][1]+=dp[i][j-1][k][l][2][1];
167                 dp[i][j][k][l][1][2]+=dp[i][j-1][k][l][2][2];
168             }
169             if (l>0) if (dp[i][j][k][l-1][2][1]==maxx)
170             {
171                 cnt++;
172                 dp[i][j][k][l][1][0]+=dp[i][j][k][l-1][2][0];
173                 dp[i][j][k][l][1][1]+=dp[i][j][k][l-1][2][1];
174                 dp[i][j][k][l][1][2]+=dp[i][j][k][l-1][2][2];
175             }
176             dp[i][j][k][l][1][0]=dp[i][j][k][l][1][0]/cnt;
177             dp[i][j][k][l][1][1]=dp[i][j][k][l][1][1]/cnt;
178             dp[i][j][k][l][1][2]=dp[i][j][k][l][1][2]/cnt;
179         }
180     }
181     scanf("%d",&tt);
182     while (tt--)
183     {
184         scanf("%d%d%d%d",&h1,&h2,&h3,&h4);
185         printf("%.6lf %.6lf %.6lf\n",dp[h1][h2][h3][h4][0][0],dp[h1][h2][h3][h4][0][1],dp[h1][h2][h3][h4][0][2]);
186     }
187     return 0;
188 }
View Code of H

 

posted @ 2020-11-22 15:19  idyllic  阅读(146)  评论(0)    收藏  举报