首页 > 代码库 > spoj8549 BST again dp
spoj8549 BST again dp
题意:给你n和h
思路:设dp[ n ][ h ]为 n 个节点高度不超过 h 的二叉搜索树的个数。那么
即选定一个点,枚举左子树的个数问为 i ,剩余右子树的个数即为n - 1 - i 。详见代码:
/********************************************************* file name: spoj8549.cpp author : kereo create time: 2014年12月05日 星期五 22时45分10秒 *********************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<set> #include<map> #include<vector> #include<stack> #include<cmath> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int sigma_size=26; const int N=500+50; const int MAXN=100000+50; const int inf=0x3fffffff; const double eps=1e-8; const int mod=1000000000+7; #define L(x) (x<<1) #define R(x) (x<<1|1) #define PII pair<int, int> #define mk(x,y) make_pair((x),(y)) int n,m; ll dp[N][N]; ll dfs(int n,int m){ if(m<0) return 0; if(dp[n][m]!=-1) return dp[n][m]; dp[n][m]=0; if(n == 0){ dp[n][m]=1; return dp[n][m]; } for(int i=0;i<=n-1;i++){ dp[n][m]+=dfs(i,m-1)*dfs(n-1-i,m-1); if(dp[n][m]>=mod) dp[n][m]%=mod; } return dp[n][m]; } int main(){ int T; scanf("%d",&T); memset(dp,-1,sizeof(dp)); while(T--){ scanf("%d%d",&n,&m); m++; printf("%lld\n",(dfs(n,m)-dfs(n,m-1)+mod)%mod); } return 0; }
spoj8549 BST again dp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。