1527C - Sequence Pair Weight,HDU 3853,POJ 2151,148D - Bag of mice 概率dp

120 阅读1分钟

1528A - Parsa's Humongous Tree 树形dp

1527C - Sequence Pair Weight

两点对总答案的贡献是i*(n-j+1),也就是这两个点出现在多少子段中,而对于第三个点来说,第二个点和第三个点的贡献是j*(n-k+1),第一个点和第三个点的贡献是i*(n-k+1),所以第三个点总的是(i+j)*(n-k+1),所以答案就好统计了,用一个map记录下标和就可以

C - Sequence Pair Weight(组合数学)_zjj0624的博客-CSDN博客

ll t,n,a[100005];
int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        map<ll,ll>mp;
        ll ans=0;
        for(int i=1;i<=n;i++){
            ans+=mp[a[i]]*(n-i+1);
            mp[a[i]]+=i;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

LOOPS - HDU 3853 - Virtual Judge (vjudge.net) 概率dp

dp[i][j]表示从ij这个点走出去的期望,转移方程很好求,主要是可能会有a[i][j].s==1的情况,continue掉就不会wa了

ll R,C;
double dp[1005][1005];
struct node{
    double s,r,d;
}a[1005][1005];
int main(){
    while(scanf("%lld%lld",&R,&C)!=EOF){
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=R;i++)
            for(int j=1;j<=C;j++) scanf("%lf%lf%lf",&a[i][j].s,&a[i][j].r,&a[i][j].d);
        dp[R][C]=0;
        for(int i=R;i>=1;i--)
        for(int j=C;j>=1;j--){
            if(i==R&&j==C) continue;
            if(fabs(1-a[i][j].s)<eps) continue;
            dp[i][j]=(dp[i+1][j]*a[i][j].d+dp[i][j+1]*a[i][j].r+2)/(1.0-a[i][j].s);
        }
        printf("%.3lf\n",dp[1][1]);
    }
    return 0;
}

Check the difficulty of problems - POJ 2151 - Virtual Judge (vjudge.net) 概率dp

dp[i][j][k]表示第i个队伍前j个题目做出k个的概率,s[i][j]表示第i个队伍做出的题数小于等于k的概率,那么只要求出每个队伍都至少作对一题的概率p1=sum(1-s[i][0]),和每个队伍都做出1-n-1题的概率p2=sum(s[i][n-1]-s[i][0]),一减就是答案

ll m,t,n;
double a[1005][35],s[1005][35],dp[1005][35][35];
int main(){
    while(scanf("%lld%lld%lld",&m,&t,&n)!=EOF){
            if(m==0&&t==0&&n==0) break;
        for(int i=1;i<=t;i++)
            for(int j=1;j<=m;j++) scanf("%lf",&a[i][j]);
        memset(dp,0,sizeof(dp));
        memset(s,0,sizeof(s));
        for(int i=1;i<=t;i++){
            dp[i][0][0]=1;
            for(int j=1;j<=m;j++) dp[i][j][0]=dp[i][j-1][0]*(1-a[i][j]);
            for(int j=1;j<=m;j++)
                for(int k=1;k<=j;k++)
                dp[i][j][k]=dp[i][j-1][k-1]*a[i][j]+dp[i][j-1][k]*(1-a[i][j]);
            s[i][0]=dp[i][m][0];
            for(int j=1;j<=m;j++) s[i][j]=s[i][j-1]+dp[i][m][j];
        }
        double p1=1,p2=1;
        for(int i=1;i<=t;i++){
            p1*=(1-s[i][0]);
            p2*=(s[i][n-1]-s[i][0]);
        }
        printf("%.3lf\n",p1-p2);
    }
    return 0;
}

148D - Bag of mice 概率dp

dp[i][j]表示轮到自己时还有i个白的,j个黑的,赢得概率

那么直接赢得概率是i/(i+j),跑掉一个黑的是j*(i+j)+(j-1)(i+j-1)+(j-2)(i+j-2),跑掉一个白的是j*(i+j)+(j-1)(i+j-1)+i(i+j-2),预处理一下初始条件就可以了

【原创】概率DP总结 by kuangbin - kuangbin - 博客园 (cnblogs.com)

ll w,b;
double dp[1005][1005];
int main(){
    scanf("%lld%lld",&w,&b);
    for(int i=1;i<=w;i++) dp[i][0]=1;
    for(int i=0;i<=b;i++) dp[0][i]=0;
    for(int i=1;i<=w;i++)
    for(int j=1;j<=b;j++){
        dp[i][j]+=i*1.0/(i+j);
        if(j>2) dp[i][j]+=j*1.0/(i+j)*(j-1)*1.0/(i+j-1)*(j-2)*1.0/(i+j-2)*dp[i][j-3];
        if(j>1) dp[i][j]+=j*1.0/(i+j)*(j-1)*1.0/(i+j-1)*i*1.0/(i+j-2)*dp[i-1][j-2];
    }
    printf("%.9lf\n",dp[w][b]);
    return 0;
}