您的位置:首页 > 其它

Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) D. Singer House(dp)

2017-07-22 10:56 501 查看
题目链接:http://codeforces.com/contest/830/problem/D

dp[i][j]表示i层,有j个不相容的路径的方案数,每次加入一个根节点有四种情况,选根节点为一个单独的路径,不选根节点,选根节点和左/右子树某个路径相连,选根节点将两个路径连在一起。用long long会T,具体转移方程看题解。

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=505;
const int MOD=1e9+7;
typedef long long ll;
int dp[MAXN][MAXN];
void add(int &a,int b)
{
a+=b;
if(a>=MOD)
a-=MOD;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
scanf("%d",&n);
dp[1][0]=1,dp[1][1]=1;
for(int i=1;i<n;i++)
{
for(int l=0;l<=n;l++)
{
for(int r=0;r<=n;r++)
{
int sum=((ll)dp[i][l])*dp[i][r]%MOD;
if(l+r+1<=n)
add(dp[i+1][l+r+1],sum);
if(l+r<=n)
{
add(dp[i+1][l+r],sum);
add(dp[i+1][l+r],(ll)sum*2%MOD*(l+r)%MOD);
}
if(l+r-1<=n&&l+r-1>=0)
{
add(dp[i+1][l+r-1],(ll)sum*((l+r)*(l+r-1)/2)%MOD*2%MOD);
}
}
}
}
printf("%d\n",dp
[1]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐