官方题解:http://wyfcyx.is-programmer.com/posts/95490.html
A
目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算?
1 //Round2 A 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<iostream> 6 #include<algorithm> 7 #define rep(i,n) for(int i=0;i<n;++i) 8 #define F(i,j,n) for(int i=j;i<=n;++i) 9 #define D(i,j,n) for(int i=j;i>=n;--i) 10 #define pb push_back 11 using namespace std; 12 typedef long long LL; 13 inline int getint(){ 14 int r=1,v=0; char ch=getchar(); 15 for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1; 16 for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch; 17 return r*v; 18 } 19 const int N=110; 20 /*******************template********************/ 21 int n,m; 22 double a[10][110]; 23 24 void work1(){ 25 double ans=1.0; 26 F(i,1,m) ans*=(1.0-a[1][i]); 27 printf("%.9f\n",1.0-ans); 28 } 29 void work2(){ 30 double ans=0.0; 31 F(i,1,m) ans*=(1.0-a[1][i]); 32 } 33 int mp[10][110],my[N]; 34 bool vis[N]; 35 long double ans=0.0,gailv=1.0; 36 37 bool go(int x){ 38 F(i,1,m) 39 if (mp[x][i] && !vis[i]){ 40 vis[i]=1; 41 if (!my[i]||go(my[i])){ 42 my[i]=x; 43 return 1; 44 } 45 } 46 return 0; 47 } 48 void check(){ 49 // F(i,1,n){ F(j,1,m) printf("%d ",mp[i][j]); puts("");} 50 int tmp=0; 51 memset(my,0,sizeof my); 52 F(i,1,n){ 53 memset(vis,0,sizeof vis); 54 if (go(i)) tmp++; 55 } 56 double gl=gailv; 57 // printf("%d %.9f\n\n",tmp,gl); 58 ans+=tmp*gailv; 59 } 60 void dfs(int x,int y){ 61 // printf("dfs %d %d\n",x,y); 62 if (x==n+1){check();return;} 63 D(i,1,0){ 64 mp[x][y]=i; 65 gailv*=i*a[x][y]+(1-i)*(1.0-a[x][y]); 66 if (y==m) dfs(x+1,1); 67 else dfs(x,y+1); 68 mp[x][y]=0; 69 gailv/=i*a[x][y]+(1-i)*(1.0-a[x][y]); 70 } 71 } 72 void work3(){ 73 dfs(1,1); 74 double as=ans; 75 printf("%.9f\n",as); 76 } 77 int main(){ 78 #ifndef ONLINE_JUDGE 79 freopen("A.in","r",stdin); 80 freopen("A.out","w",stdout); 81 #endif 82 n=getint(); m=getint(); 83 F(i,1,n) F(j,1,m) scanf("%lf",&a[i][j]); 84 if (n==1) work1(); 85 // else if (n==2) work2(); 86 else 87 work3(); 88 return 0; 89 }