⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usaco_nocows-求有n个节点高度是k的二叉树有多少个.cpp

📁 usaco自己做的1到5章的代码
💻 CPP
字号:
/*ID: wangyuc2
PROG: nocows
LANG: C++*/
/*
这道题的意思就是求有N个节点高度是k的二叉树有多少个

有dp求解,一开始虽然想到了dp,但还是在看了题解后才做出来的

F[i,j]=∑F[i-1,d]*F[i-1,j-1-d]

最大高度是i,j个节点的二叉树一共有F[i,j]种组成的方法

等于最大高度是i-1,d个节点的二叉树和j-1-d个节点的二叉树的积,乘法原理.d属于1..j-2,而且j,d,j-1-d要是奇数

边界条件是F[i,1]=1;

在有就是在实现时要随时的mod9901,至于为什么则是数论的知识

*/
#include <fstream>
#include <iostream>
#include <memory>
#include <algorithm>
using namespace std;
ifstream fin("nocows.in");
ofstream fout("nocows.out");
int main()
{
      int n,k,i,j,l;
      long int f[200][100];  
      fin>>n>>k;  
      if(n % 2 == 0) 
      {
           fout<<'0'<<endl; 
           exit(0);
      }  
      memset(f,0,sizeof(f));  
      for(i=1;i<=k;i++) f[1][i]=1;  
      for(j=1;j<=k;j++) 
           for(i=1;i<=n;i=i+2)  
                 for(l=1;l<=i-2;l++)        
                 {            
                     f[i][j]=(f[i][j]+f[l][j-1]*f[i-l-1][j-1])%9901;            //f[i][j]%=9901;  
                 }  
      fout<<(f[n][k]-f[n][k-1]+9901)%9901<<endl;  
      //system("PAUSE");
      return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -