当前位置:编程学习 > C/C++ >>

zoj 3329 One Person Game 概率dp(有环)

自己看了很多blog才弄明白,自己就不说什么啦,建议在做几道简单题再做这道题,我认为这个blog写的很好,很具体 http://blog.csdn.net/morgan_xww/article/details/6775853
[cpp] 
#include<iostream> 
#include<cstdio> 
using namespace std; 
#define M 505 
double dp[M],A[M],B[M],p[M]; 
int n,k1,k2,k3,a,b,c; 
int main(){ 
 //   freopen("in.txt","r",stdin); 
    int cases; 
    scanf("%d",&cases); 
    while(cases--){ 
        scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c); 
        double p0=1*(1.0)/k1/k2/k3; 
        for(int i=0;i<500;i++){ 
            p[i]=dp[i]=A[i]=B[i]=0; 
        } 
        for(int i=1;i<=k1;i++){ 
            for(int j=1;j<=k2;j++){ 
                for(int k=1;k<=k3;k++){ 
                    if(i==a&&j==b&&k==c) p[i+j+k]=0; 
                    else p[i+j+k]+=p0; 
                } 
            } 
        } 
        A[0]=p0;B[0]=1; 
        for(int i=n;i>=0;i--){ 
            for(int j=3;j<=(k1+k2+k3);j++){ 
                A[i]+=A[i+j]*p[j]; 
                B[i]+=B[i+j]*p[j]; 
            } 
        } 
        dp[0]=B[0]/(1-A[0]); 
        printf("%.15lf\n",dp[0]); 
    } 

 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,