BZOJ 2685: Sgu385 highlander

本文探讨了一个复杂的动态规划问题,即在给定点数下,计算各种环状结构的组合数量及其期望值。通过定义状态转移方程,采用期望DP方法,解决了最大环大小、环的数量与总点数之间的复杂关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sol

期望DP.

\(f[i][j][k]\) 表示已经确定了 \(i\) 个点, 最大环大小为 \(j\) ,个数为 \(k\) 的方案数.

转移非常复杂,因为细节特别多.

\(f[i][j][1]=\frac{A_{j}^{n}}{j},i=j,k=1\)

\(f[i][j][1]=\frac{A_{j}^{n-i+j}}{j} \sum_{l=1}^{j} g[i][j],i>j,k=1\)  这个地方的 \(g[i][j]\) 我写的跟论文里的不太一样...不知道是论文里写错了还是我理解错了.

\(f[i][j][k]=f[i-j][j][k-1]\frac{A_{j}^{n-i+j}}{jk},i>j,1<k*j<=i\) 因为要考虑几个环的顺序,所以要除去一个 \(k\) 的排列.

其中 \(g[i][j]=\sum_{l=2}^{\frac{i}{j}} f[i][j][l] \)

\(n<=100\) 没人打表?打表Rank1系列.

Update:因为期望总是小于 \(100\) ,而double类型以对数方式储存,所以可以保证答案的正确性.

Code

/**************************************************************
    Problem: 2685
    User: BeiYu
    Language: C++
    Result: Accepted
    Time:392 ms
    Memory:10508 kb
****************************************************************/
 
#include<cstdio>
#include<iostream>
using namespace std;
 
const int N = 105;
 
int n;
double fac[N],A[N][N];
double f[N][N][N],g[N][N],d[N];
double ans;
 
int main(){
//  freopen("in.in","r",stdin);
    scanf("%d",&n);
     
    fac[0]=1;for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i;
    for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) A[i][j]=fac[i]/fac[i-j];
    d[1]=0,d[2]=1;for(int i=3;i<=n;i++) d[i]=(i-1)*(d[i-1]+d[i-2]);
     
    for(int i=1;i<=n;i++){
        for(int j=2;j<=i;j++){
            if(i==j) f[i][j][1]=A[n][j]/j;
            else{
                for(int l=2;l<j;l++) f[i][j][1]+=g[i-j][l];
                f[i][j][1]*=A[n-i+j][j]/j;
            }
            for(int k=2;k*j<=i;k++) f[i][j][k]=f[i-j][j][k-1]*A[n-i+j][j]/j/k;
        }
        for(int j=2;j<=i;j++) for(int k=1;k*j<=i;k++) g[i][j]+=f[i][j][k];
    }
     
    for(int j=2;j<=n;j++) for(int k=1;k*j<=n;k++) ans+=j*k*f[n][j][k];
    ans/=d[n];
    printf("%.14lf\n",ans);
    return 0;
}

  

 

转载于:https://www.cnblogs.com/beiyuoi/p/5862659.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值