只有恶心人的大模拟才会让懒人写博客。。。
挂着概率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 ",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 }