标签:
3 1 1 1 1 5 2 1 2 2 1 3 2 2 3 1 3 0 0
6.94 8.75
/* *********************************************** Author :CKboss Created Time :2015年05月06日 星期三 08时54分13秒 File Name :HDOJ4579_2.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; const int maxn=50050; const double eps=1e-6; double c[maxn][10]; double p[maxn][20]; double a[maxn][10]; double b[maxn]; double dp[maxn]; int n,m; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(int i=1;i<=n;i++) { double s=0; for(int j=1;j<=m;j++) { scanf("%lf",&c[i][j]); s+=c[i][j]; } c[i][0]=s; } for(int i=1;i<=n;i++) { /// Left double sum=0.; for(int j=1;j<=m;j++) { if(i-j<1) continue; p[i][m-j]=0.3*c[i][j]/(1+c[i][0]); sum+=p[i][m-j]; } /// Right for(int j=1;j<=m;j++) { if(i+j>n) continue; p[i][m+j]=0.7*c[i][j]/(1+c[i][0]); sum+=p[i][m+j]; } p[i][m]=-sum; b[i]=-1; } for(int i=1;i<=m+1&&i<=n;i++) a[1][i]=p[1][m+i-1]; for(int i=2;i<n;i++) { int start=max(1,i-m); int end=min(n,i+m); for(int j=start;j<i;j++) // 第j行去减第i行 { if(fabs(p[i][m-i+j])<eps) continue; double t=p[i][m-i+j]/a[j][1]; for(int k=1;k<=m+1&&j+k-1<=n;k++) { p[i][m-i+j+k-1]-=a[j][k]*t; } b[i]-=t*b[j]; } for(int j=1;j<=end-i+1;j++) { a[i][j]=p[i][m+j-1]; } } dp[n]=0; for(int i=n-1;i>=1;i--) { for(int j=2;j<=m+1&&i+j-1<=n;j++) b[i]-=dp[i+j-1]*a[i][j]; dp[i]=b[i]/a[i][1]; } printf("%.2f\n",dp[1]); } return 0; }
标签:
原文地址:http://blog.csdn.net/ck_boss/article/details/45532975