标签:
概率DP。
首先由题解可得>_<,胜出概率只与剩余人数、与庄家的相对位置有关。
所以设f[i][j]表示剩下i个人,从庄家开始第j个人的胜利概率。。。
根据卡牌一通乱搞即可。。。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define d float 6 using namespace std; 7 int a[52],b[52]; 8 d f[52][52]; 9 int i,j,k,n,m; 10 11 int ra;char rx; 12 inline int read(){ 13 rx=getchar(),ra=0; 14 while(rx<‘0‘||rx>‘9‘)rx=getchar(); 15 while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra; 16 } 17 18 int main(){ 19 n=read(),m=read(); 20 for(i=1;i<=m;i++)a[i]=read();register int k; 21 f[1][1]=1.0; 22 for(i=2;i<=n;i++){ 23 for(j=1;j<=m;j++)b[j]=(a[j]-1)%i+1; 24 for(j=1;j<=i;j++){ 25 d tmp=0.0;int zj; 26 for(k=1;k<=m;k++)if(b[k]!=j) 27 zj=b[k]==i?1:b[k]+1, 28 tmp+=f[i-1][j>=zj?j-zj+1:i-(zj-j)+1]; 29 f[i][j]=tmp/m; 30 } 31 } 32 for(i=1;i<n;i++)printf("%.2f",f[n][i]*100),putchar(‘%‘),putchar(‘ ‘);printf("%.2f",f[n][n]*100);puts("%"); 33 }
标签:
原文地址:http://www.cnblogs.com/czllgzmzl/p/5622135.html