标签:转移 自身 mes ace -- target i++ namespace can
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1450
期望DP;
INF 表示这种情况不行,转移时把不行的概率也转移到自身即可;
还要按得星概率排个序,先决策概率大的就是最优策略,因为后面的都基于它。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int const maxn=2005,inf=1e9; int n,m; double f[maxn][maxn<<1]; struct N{double p1,p2,p0;}a[maxn]; bool cmp(N x,N y){return x.p2==y.p2?x.p1<y.p1:x.p2<y.p2;} int main() { scanf("%d%d",&n,&m); for(int i=1,x,y;i<=n;i++) { scanf("%d%d",&x,&y); a[i].p0=1.0*(1000-x-y)*0.001; a[i].p1=1.0*x*0.001; a[i].p2=1.0*y*0.001; } sort(a+1,a+n+1,cmp); for(int j=0;j<m;j++)f[n+1][j]=inf; for(int i=m,d=((n+1)<<1);i<=d;i++) f[n+1][i]=0; for(int i=n;i;i--) for(int j=0;j<=2*i;j++) { double k=1-a[i].p0; if(f[i+1][j+1]==inf&&f[i+1][j+2]==inf)f[i][j]=inf; else if(f[i+1][j+1]==inf)k=k-a[i].p1,f[i][j]=(f[i+1][j+2]*a[i].p2+1)/k; // else if(f[i+1][j+2]==inf)k=k-p[2][i],f[i][j]=(f[i+1][j+1]*p[1][i]+1)/k;//不会有 f[i+1][j+1]!=inf 而 f[i+1][j+2]=inf 的情况 else f[i][j]=(f[i+1][j+1]*a[i].p1+f[i+1][j+2]*a[i].p2+1)/k; } printf("%.8lf\n",f[1][0]); return 0; }
标签:转移 自身 mes ace -- target i++ namespace can
原文地址:https://www.cnblogs.com/Zinn/p/9643681.html