Problem Description
There are N blanks arranged in a row. The blanks are numbered 1,2,…,N from left to right.
Tom is filling each blank with one number in {0,1,2,3}. According to his thought, the following M conditions must all be satisfied. The ith condition is:
There are exactly xi different numbers among blanks ∈[li,ri].
In how many ways can the blanks be filled to satisfy all the conditions? Find the answer modulo 998244353.Input
The first line of the input contains an integer T(1≤T≤15), denoting the number of test cases.
In each test case, there are two integers n(1≤n≤100) and m(0≤m≤100) in the first line, denoting the number of blanks and the number of conditions.
For the following m lines, each line contains three integers l,r and x, denoting a condition(1≤l≤r≤n, 1≤x≤4).Output
For each testcase, output a single line containing an integer, denoting the number of ways to paint the blanks satisfying all the conditions modulo 998244353.
Sample Input
2
1 0
4 1
1 3 3Sample Output
4
96
题意:给出一个长度为 n 的数组,每个位置要填入 0~3 中的任意一个数,再给出 m 个限制条件,l r x 代表区间 [l,r] 中出现的数字种数恰好为 x 种,问有多少种方案
思路:
限制是一个区间内有几个不同的数,因此不必知道每个位置具体放的是什么数,定义一个四维数组 dp[i][j][k][p][cur] 来存储数字 0、1、2、3 出现的最后位置为 i、j、k、p ,用 cur 来表示填充到第 cur 个格子
那么根据以求得的 dp[i][j][k][p][cur-1] 可以得到状态转移方程:
这样对于每一个状态转移方程,当 cur=r 时,根据 0、1、2、3 出现的最后位置 i、j、k、p 来判断是否大于等于 l,从而得出有几个不同的数,如果不同的数的个数不等于 x,那么说明不满足限制条件,置 dp[i][j][k][p][cur]=0
此时时间复杂度、空间复杂度都达到 O(n^5),超出题目给定的范围,需要进行优化
由于 i、j、k、p 表示 0、1、2、3 最后一次出现的位置,那么可以发现,其中一定有一个值是等于 cur 的,而且互不相等,那么可将 5 维数组 dp[i][j][k][p][cur] 压缩到 4 维 dp[i][j][k][cur] 以代表 i、j、k、cur 是不同的数最后出现的位置,且 i 于是,根据以求得的 dp[i][j][k][cur-1] 可以得到状态转移方程: 这样一来,时间复杂度、空间复杂度都优化到 O(n^4),时间可以,但空间仍然超出范围 根据动态规划的无后效性原则,dp[i][j][k][cur] 只与 dp[i][j][k][cur-1] 有关,那么可以利用滚动数组来再次优化 设 dp[i][j][k][2],那么就有状态转移方程: 由于是累加,因此在利用滚动数组时,dp[i][j][k][now] 每次用完要进行清空 这样时间复杂度为 O(n^4),空间复杂度为 O(2*n^3),满足题目限制
Source Program
#include