[NOIP模拟测试]:matrix(DP)

题目描述

求出满足以下条件的$n*m$的$01$矩阵个数:
(1)第$i$行第$1~l_i$列恰好有$1$个$1$。
(2)第$i$行第$r_i~m$列恰好有$1$个$1$。
(3)每列至多有$1$个$1$。


输入格式

第一行两个整数$n,m$。接下来$n$行每行$2$个整数$l_i,r_i$。


输出格式

一行一个整数表示答案。对998244353取模。


样例

样例输入

2 6
2 4
5 6

样例输出

12


数据范围与提示

对于$20%$的数据,$n,m\leqslant 12$。
对于$40%$的数据,$n,m\leqslant 50$。
对于$70%$的数据,$n,m\leqslant 300$。
对于$100%$的数据,$n,m\leqslant 3000$,$1\leqslant l_i<r_i\leqslant m$。


题解

看到这道题,首先应该想到组合数,然后……

我一开始想的是容斥,正好能模过样例,但是忽然发现是一个多步容斥,无语……

$20%$算法:

使劲搜就好了,别搜错了,记得别用clock(),递归函数里clock()返回值玄学(考场上被这东西干没了40分……)。

$100%$算法:

考虑$DP$,定义有点意思,定义$dp[i][j]$表示当前到了第$i$列,已经有$j$列在右侧区间放$1$的方案数。

下面来解释一下,注意右侧区间不是第$i$列的右侧,而是$r_i$,理解这东西我用了半个小时……

下面在来看一下如何转移:

  

猜你喜欢

转载自www.cnblogs.com/wzc521/p/11286405.html