当前位置: 首页 > news >正文

数据结构代码复习 持续更新

1.BST的计数

思路:

得到数组后从小到大排序,每插入一个数后,那个数就变成了一个隔板,假如插入的数是数组的未插入元素的边界那么隔板就在边界,无效果

假如插入的数是数组中间,隔板就在中间,此时下一步选择隔板左的数或隔板右的数,最后形成的树是等价的 比如123 选择2,那么后面选择13还是31树形相同。
整个问题就可以从小大到DP解决:

直接计算隔板左的数有多少种不同组合,隔板右的数有多少种不同组合。

最小问题:

1个数的BST 1个

2个数的BST 2个

3个数的BST 5个

4个数可以利用之前的得到的结果解题:

如果你在疑问为什么隔板两边要相乘,来看5个的插入

那么就得到关键代码:

for(int i =1;i<n;i++)
{for(int j=0;j<i;j++){dp[i]=dp[i]+(dp[j]*dp[i-j-1]);}} 

来看整体代码:

#include <iostream>
#include <vector>
using namespace std;const int MOD = 1000000007;int main() {int T;cin >> T;vector<int> testCases(T);int maxN = 0;// 读取所有测试用例并找到最大的n值for (int i = 0; i < T; i++) {cin >> testCases[i];if (testCases[i] > maxN) {maxN = testCases[i];}}// 动态规划计算Catalan数vector<long long> dp(maxN + 1, 0);dp[0] = 1; // 基础情况:0个节点只有1种空树for (int i = 1; i <= maxN; i++) {for (int j = 0; j < i; j++) {// 状态转移方程:dp[i] = Σ (dp[j] * dp[i - j - 1])dp[i] = (dp[i] + (dp[j] * dp[i - j - 1]) % MOD) % MOD;}}// 输出结果for (int i = 0; i < T; i++) {cout << dp[testCases[i]] << endl;}return 0;
}

这相当于一种求和:

如果你写下了这些代码并想到了展开,恭喜你得到卡特兰数

http://www.dtcms.com/a/432950.html

相关文章:

  • 台州网站建设选浙江华企济南正规做网站公司
  • 如何制作私人网站预约支付wordpress
  • 做网站为什么用php桂林网站搭建
  • 微信导航网站 dedecms免费的模板网站
  • 做网站法律条文中天钢铁 网站建设
  • 做网站需求文档怎样办网站
  • 官方网站下载打印机驱动wordpress移动端导航菜单
  • 物流网站免费模板安卓app制作公司
  • 小迪web自用笔记45
  • 南京企业自助建站系统wordpress 打开速度慢
  • 做网站建设需要会哪些网站设计公司皆选奇点网络
  • 献县网站建设网络科技公司起名免费
  • 泰安放心的企业建站公司如何提高网站的点击率
  • 网站开发需要学些什么?网站建设方案及报
  • 山东省住房和城乡建设部网站首页下载爱南宁乘车
  • 如何让百度收录我的网站怎么创建网站论坛
  • 锦州网站开发招聘做搜狗网站排名软件
  • 摄影网站知乎seo关键词挖掘工具
  • 建设网站需要哪些职位二级域名查询网站
  • 网站放在服务器上网站开发中
  • 上海徐家汇网站建设优化设计答案
  • 专门做汽车配件的外贸网站wordpress4.8换成中文
  • 食品行业网站建设方案安卓软件制作工具
  • 福建建设资格管理中心网站跨境电商平台一览表
  • 管理网站建设wordpress安装数据库错误
  • 西安网站排名分析html 手机网站
  • 神经网络中的损失函数:常见类型与应用场景(代码演示)
  • 旅游平台网站合作建设方案应用商城官网下载最新版
  • 文件统计工具开发全记录:从需求到实现的完整指南
  • 如何查到别人的网站做哪些竞价词浙江城乡与住房建设部网站