hdu 5013 City Tour

来源:互联网 发布:armin van buuren知乎 编辑:程序博客网 时间:2024/05/18 02:52


#pragma comment(linker, "/STACK:102400000,102400000")#include<iostream>#include<vector>#include<algorithm>#include<cstdio>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<cmath>#include<cassert>#include<cstring>#include<iomanip>using namespace std;#ifdef _WIN32#define i64 __int64#define out64 "%I64d\len"#define in64 "%I64d"#else#define i64 long long#define out64 "%lld\len"#define in64 "%lld"#endif/************ for topcoder by zz1215 *******************/#define foreach(c,itr)  for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)#define FOR(i,a,b)      for( int i = (a) ; i <= (b) ; i ++)#define FF(i,a)         for( int i = 0 ; i < (a) ; i ++)#define FFD(i,a,b)      for( int i = (a) ; i >= (b) ; i --)#define S64(a)          scanf(in64,&a)#define SS(a)           scanf("%d",&a)#define LL(a)           ((a)<<1)#define RR(a)           (((a)<<1)+1)#define pb              push_back#define pf              push_front#define X               first#define Y               second#define CL(Q)           while(!Q.empty())Q.pop()#define MM(name,what)   memset(name,what,sizeof(name))#define MC(a,b)memcpy(a,b,sizeof(b))#define MAX(a,b)        ((a)>(b)?(a):(b))#define MIN(a,b)        ((a)<(b)?(a):(b))#define read            freopen("out.txt","r",stdin)#define write           freopen("out2.txt","w",stdout)const int inf = 0x3f3f3f3f;const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;const double oo = 10e9;const double eps = 10e-11;const double pi = acos(-1.0);const int maxn = 16;int n, m;double dp[1 << maxn][17];double ch[1 << maxn][17];double ey[1 << maxn][17];double go[1 << maxn][17];double IIp[1 << maxn];double p[17];double px[17];double pto[17][17];double pn[17][17];double h[20][20];int have[1 << maxn];int lg2[1 << maxn];int sgn(double x){if (x>1e-20) return 1;if (x<-1e-20) return -1;return 0;}double start(){for (int i = 0; i < n; i++){if (sgn(p[i] - 1) == 0) p[i] -= 1e-10;px[i] = p[i] / (1.0 - p[i]);}for (int now = 0; now < (1 << n); now++){IIp[now] = 1.0;for (int i = 0; i < n; i++){if (now&(1 << i)){IIp[now] *= 1.0 - p[i];}}}for (int now = 0; now < (1 << n); now++){dp[now][0] = 1;}for (int step = 1; step <= n; step++){for (int now = 0; now < (1 << n); now++){if (!now){dp[now][step] = 0;}else{dp[now][step] = dp[now - (now&(-now))][step - 1] * px[lg2[now&(-now)]] + dp[now - (now&(-now))][step];}}}for (int now = 0; now < (1 << n); now++){for (int i = 0; i < n; i++){ch[now][i] = 0;if (now & (1 << i)){int rest = now - (1 << i);for (int cnt = 0; cnt < n; cnt++){ch[now][i] += px[i] * dp[rest][cnt] * (cnt + 1.0 + have[now]);}ch[now][i] /= have[now];ch[now][i] *= IIp[now];}}}for (int now = 0; now < (1 << n); now++){for (int pos = 1; pos < m; pos++){ey[now][pos] = 0;for (int i = 0; i < n; i++){if (now&(1 << i)){ey[now][pos] += h[i][pos] * ch[now][i];}}}}for (int i = 0; i < n; i++){pto[i][0] = 1.0;for (int j = 1; j < m; j++){pto[i][j] = 1.0;for (int k = 1; k <= j; k++){pto[i][j] *= p[i];}pn[i][j] = pto[i][j] / (1.0 - pto[i][j]);}}for (int now = 0; now < (1 << n); now++){go[now][0] = 0;}go[(1<<n)-1][0] = 1.0;for (int pos = 1; pos < m; pos++){go[0][pos] = 1.0;for (int i = 0; i < n; i++){go[0][pos] *= 1.0 - pto[i][pos];}for (int now = 1; now < (1 << n); now++){go[now][pos] = go[now - (now&(-now))][pos] * pn[lg2[now&(-now)]][pos];}}double ans = 0.0;for (int i = 0; i < n; i++){ans += h[i][0];}for (int pos = 1; pos < m; pos++){for (int now = 0; now < (1 << n); now++){ans += go[now][pos - 1] * ey[now][pos];}}return ans;}int main(){for (int i = 0; i < maxn; i++){lg2[1 << i] = i;}for (int now = 0; now < (1 << maxn); now++){have[now] = 0;for (int i = 0; i < maxn; i++){if (now&(1 << i)) {have[now]++;}}}while (cin >> n>> m){for (int i = 0; i < n; i++){cin >> p[i];}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> h[i][j];}}printf("%.10lf\n", start());}return 0;}



0 0
原创粉丝点击