生成字符串

SCOI2010] 生成字符串 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一个生成字符串的任务,任务需要把 n个 1 和 m个 0 组成字符串,在组成的字符串中,在任意的前 k个字符中,1的个数不能少于 0 的个数。满足要求的字符串共有多少个.

一个经典问题:

一只绿鸟50元,一堆人买绿鸟,有人有100元,有人有50元。绿鸟商刚开始没有钱,问有几种排队方法,使得绿鸟商总可以随时找零。

此题中的0就是100元,1就是50元,生成的字符串就是排队方案。

分析:

必须是:n>=m

选择字符1表示:向右上走(x坐标+1,y坐标+1)

选择字符0表示:向右下走(x坐标+1,y坐标-1)

这样子如果不考虑限制条件,

就表示从(0,0)走n+m步到达(n+m,n-m),这相当于从n+m步中选择m步向下走也就是C(n+m,m).


考虑限制条件,任意前缀1的个数>=0的个数,也就是路线不能经过y=-1这条线。

利用等效替代法

我们把不合法的情况在经过 y=-1 这条线之前的线以 y=-1 为对称轴向下翻折。

起点就变成了 (0,-2),终点仍然是 (n+m,n-m)。翻转时1的个数+1,0的个数-1,

古方案数C(n+m,m-1)

ans=C(n+m,m)-C(n+m,m-1).


另一种情况

一个生成字符串的任务,任务需要把 n个 1 和 m个 0 组成字符串,在组成的字符串中,在任意的前 k个字符中,1的个数大于 0 的个数。满足要求的字符串共有多少个.

SP19148 INS14G - Kill them All - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

分析:

第一个字符必须为1,

从第二个字符开始算,在任意前k个字符中,1的个数>=0的个数,

即转化成n-1个1和m个0的情况数。

posted on 2022-05-04 23:01  naiji  阅读(92)  评论(0编辑  收藏  举报