这题状态第二维设大于等于 j 层能不能做
查看原帖
这题状态第二维设大于等于 j 层能不能做
399150
ShunpowerSHUN理成张楼主2023/9/12 19:17

RT,用类似随机树这题的方法转移,每次合并左子树和右子树。具体来说考虑 dpi,jdp_{i,j} 表示点数为 ii,至少为 jj 层的二叉树构成完满二叉树的形态数量,转移时容斥:

dpi,j←dpp,j×dpi−1−p,1+dpp,1×dpi−1−p,j−dpp,j×dpi−1−p,jdp_{i,j}\gets dp_{p,j}\times dp_{i-1-p,1}+dp_{p,1}\times dp_{i-1-p,j}-dp_{p,j}\times dp_{i-1-p,j}

下面是我的实现:

cin>>n>>k;
dp[1][1]=1,dp[3][1]=dp[3][2]=1;
fr1(i,4,n){
    fr1(j,2,k+1){
        fr1(p,1,i-2){
            dp[i][j]+=(dp[p][j-1]*dp[i-1-p][1]%M+dp[p][1]*dp[i-1-p][j-1]%M-dp[p][j-1]*dp[i-1-p][j-1]%M+M)%M;
            dp[i][j]%=M;
        }
    }
}
cout<<(dp[n][k]-dp[n][k+1]+M)%M<<endl;

然而只有 4949 分。希望可以得到指出错误或者较小的 hack(下载数据是 199 77 /kk)。

2023/9/12 19:17
加载中...