原题地址
大致题意:给你n个块(n为偶数),要对这n个块进行上色,有k种颜色可以选取,上的颜色需要两两配对并且不能交叉。若第x与y同色,u与v同色,当且仅当x<u<y<v时被认为是交叉。

可以考虑合法的染色数一定可以写成一个合法的括号匹配序列

如 abba 对应 (()) aabb 对应 ()()

但是这并不是唯一对应

如 aaaa 同时对应 (()) 和 ()()

那么显然可以考虑我每次从左到右如果都让未匹配的字母和它右边第一个相同的字母匹配,那么显然一个合法的序列对应唯一的一种括号匹配序列。
那么长度为2*n的合法括号匹配的个数为多少?

括号匹配序列和卡特兰数

设h(i)为长度为2*n的合法括号匹配的数量。
那么 h(0)=1,空括号看成一种方案
显然  h(1)=1: ()
    h(2)=2: ()() (())
对于h(n)我们可以考虑最左边的一定是左括号,那么我们可以枚举与之匹配的第一个右括号的位置,对这个括号的外部和内部填充合法的匹配方案,即可得到递推式:
h(n)=∑i=0n−1h(i)∗h(n−1−i)h(n)=\sum_{i=0}^{n-1}h(i)*h(n-1-i) h(n)=i=0∑n−1​h(i)∗h(n−1−i)
这正是卡特兰数的递推式
所以长度为2*n的合法括号匹配数为Catalan(n)
参考资料:
卡特兰数-百度百科

接下来考虑对括号进行染色

下文用“第一个括号”代表左括号在序列最左边的那对括号

上面卡特兰数的这种递推思想非常值得学习
设f(i)为长度为2*i的合法序列数。
f(0)=1
f(1)=k;
考虑和上面一样枚举第一个括号的位置,然后在其中填入之前已经算出来的合法序列。但是这样会出现以下问题,假设当前的n=4,k=2:
f(1)=2 :aa bb
计算f(2)的时候考虑第一个括号的颜色是a并且其右括号在第二个位置时有aaaa aabb

第一个括号的颜色是a并且其右括号在第四个位置时有
aaaa abba

aaaa被重复计数了!
这种情况其实是由于在一个合法序列的最外层加一层括号时改变了其内部本来的匹配方法,例如:
aa bb aa

在其外部加上bb之后变成
b a a b b a a b

那么考虑在外层加什么颜色的括号可以防止这种事情发生?
加原来序列里没有的颜色?不对。这样又缩小了范围,比如:
baab在其外部加上aa并不会影响其匹配关系。
如果当前加上的颜色和这个序列本身最外层括号的颜色都不同,那么就不会影响原来的匹配方法。
最外层括号: (()())() 的最外层括号为(____)()
回到刚刚的枚举过程,在枚举了第一个括号的位置后在其内部放入最外层括号的颜色都与第一个括号颜色不同的序列,然后其后面放正常的合法序列即可。
定义g(i)为长度为2*i 并且最外层括号不为某种特定颜色的方案数
g(0)=1
显然由上面的描述可以得到递推式为
f(n)=∑i=0n−1k∗g(i)∗f(n−1−i)f(n)=\sum_{i=0}^{n-1}k*g(i)*f(n-1-i) f(n)=i=0∑n−1​k∗g(i)∗f(n−1−i)

如何求g(n)?

同样考虑上文的枚举方法,枚举第一个扩号的右括号的位置,那么此时又会遇到和上面相同的问题,需要保证第一个括号内部的最外层的括号的颜色都与第一个括号不同。
正好就是g(i )的定义!!!
这需要深入理解g的定义,明白此时的“不为某种特定的颜色”和填在第一个括号外面的“不为某种特定的颜色”指的不是同一个颜色,整个g指的是不为将要在其外面加的括号的颜色相同,而在第一个括号内部的是指不和第一个括号相同,虽然指的不是同一个颜色但是显然数量上是相等的。
读者可手动模拟演算,帮助理解!
于是就有了g的递推式:
g(n)=∑i=0n−1(k−1)∗g(i)∗g(n−1−i)g(n)=\sum_{i=0}^{n-1}(k-1)*g(i)*g(n-1-i) g(n)=i=0∑n−1​(k−1)∗g(i)∗g(n−1−i)

代码如下

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll g[1505],f[1505];
const ll mod=1e9+7;
int main()
{ll n,k;cin>>n>>k;n>>=1;g[0]=f[0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=i-1;j++){g[i]=(g[i]+(k-1)*g[j]%mod*g[i-1-j]%mod)%mod;}}for(int i=1;i<=n;i++){for(int j=0;j<=i-1;j++){f[i]=(f[i]+k*g[j]%mod*f[i-1-j]%mod)%mod;}}cout<<f[n]<<'\n';return 0;
}

这是本人写的第一篇博客,如果对内容有疑问欢迎指出,也欢迎和我交流讨论共同进步。

最后引用李煜东老师的一句话勉励自己:

在思维的迷宫里,有的人凭借天生的灵感直奔终点;有的人以持久的勤勉,铸造出适合自己的罗盘;有的人迷失了方向,宣告失败。

EOJ Monthly 2020.11 Sponsored by TuSimple F题“天桥”题解相关推荐

  1. EOJ Monthly 2020.7 Sponsored by TuSimple 部分题解

    文章目录 A. 打字机 B.线上考试 C.OLED A. 打字机 题解:贪心 只需要寻找最后一个d的位置,判断之前a的个数与b的个数是否相等. 如果a大于b则Sad,等于则为Happy 注意:在遍历字 ...

  2. EOJ Monthly 2020.9 Sponsored by TuSimple E. 加密的情书

    E加密的情书 本人太菜,只会签到 题意: 一个多位数可以通过加密变成个位数,加密方式为:各个位数上的数相加,直到加成个位数 例如: 123 --> 1+2+3=6 现在给出加密后的一串密文 问是 ...

  3. EOJ Monthly 2019.11 E. 数学题(反演 + 杜教筛 + 拉格朗日插值)

    EOJ Monthly 2019.11 ∑i=1n∑a1=1i∑a2=1i∑a3=1i⋯∑ak−1i∑aki[gcd(a1,a2,a3,-,ak−1,ak,i)==1]=∑i=1n∑d∣iμ(d)⌊i ...

  4. 华东师范大学2018.11月赛【EOJ Monthly 2018.11】

    [EOJ Monthly 2018.11] A. 心与心的距离 Time limit per test: 2.0 seconds Memory limit: 512 MB 近在咫尺,远在天边.心与心的 ...

  5. 2020研究生数学建模大赛F题思路代码实现

    代码已提交 仅供交流参考 赛题 2020年A题–华为题_芯片相噪算法设计.docx 2020年B题–汽油辛烷值建模.zip 2020年C题–面向康复工程的脑电信号分析和判别模型.docx 附件1-P3 ...

  6. EOJ Monthly 2018.11 D. 猜价格

    猜价格 分两种情况讨论: k≤n,先猜至多 k 次 1,由于回答 <1 肯定是假的,所以可以把剩余系下是哪次错试出来,然后用至多 n 次搞定. k>n,每个数都猜两次,如果两次结果不一样, ...

  7. 2020年电子设计大赛F题

    挺简单前一百分得了九十多 当然主要是队友很给力 1 温度判别 MLX90614DCC,然后测温拟合吧...从五十度到三十度平均一次要测一个半小时...这是真的痛苦...然后虽然文件里面说自带测温工具, ...

  8. 2020/11/15天梯赛模拟题_基础级8道题整理_简洁代码+解析

    点击题目就可以跳转到具体内容哦(无毒无害.安心跳转)~ L1-1 L1-038 新世界 (5分) L1-2 L1-051 打折 (5分) L1-3 L1-022 奇偶分家 (10分) L1-4 冠军魔 ...

  9. 2020常州市程序设计小能手真题及题解

    第一题 欢迎(welcome) 欢迎参加2020年常州市"程序设计小能手"比赛!小X想为你献上一张贺卡,不过-你得自己打印出来. 贺卡由三行组成.其中第二行为"*Welc ...

最新文章

  1. 介绍一篇通过无监督depth estimation改进语义分割的论文
  2. Python常用模块之re模块
  3. T型加速算法fpga实现思想研究
  4. Android OpenSL ES 对象结构
  5. 码云上传代码添加标签_[Android] 发布码云(Gitee)项目到JitPack(最全完整流程)
  6. HTTP协议中常见请求方法以及一些常见错误代码
  7. python 隐藏命令行窗口_python如何只执行cmd中的动作,但消除或隐藏cmd窗口 - 小众知识...
  8. spool导出姓名中文乱码_MySQL不同字符集转化标准—7步实现,杜绝乱码!
  9. JAVA如何选中一行上移,怎么把表格一行整体上移
  10. mysql备份恢复出错_MySQL:MySQL备份失败,原因和解决方式
  11. Angular实现多标签页效果(路由重用)
  12. idea 使用中文汉化包教程
  13. ROS运行管理之launch文件
  14. Excel常用小技巧
  15. ODL Netconf 连接器 + Netopeer
  16. 【微信小程序】随机点名系统(点击开始滚动名字点击结束按钮结束滚动)
  17. wormhole make 问题
  18. 国内10大技术网站,你最爱和哪个玩耍?
  19. 利用eeglab处理采集的脑电信号
  20. Git命令: rebase 和 squash命令

热门文章

  1. WSL2跟踪 - 18945: 通过localhost直接访问 WSL2 容器中的服务
  2. Craig S. Wright问答系列(1)
  3. 超级码力在线编程大赛初赛 第2场 T1-T4题解
  4. 技术探究|Apache Pulsar 认证与鉴权实践指南
  5. 菜鸟站长之家带你了解什么是百度SEO快排技术
  6. 腾讯、移动持续大手笔回购,港股龙头“带动”市场反弹?
  7. TF:TF定义两个变量相乘之placeholder先hold类似变量+feed_dict最后外界传入值
  8. 基于智能空间布局优化的系留低空应急通信系统设计及研究
  9. 如何用机器学习识别猫叫和狗叫声?
  10. 隐藏计算机文件夹中,怎样显示电脑中已隐藏的文件夹