Effect: n-long array $ $, each position range $ [0,3] $, $ m $ limitation $ (l, r, x) $ represents $ [l, r] has $ X $ $ species within number, find a few programs.
Maintenance of each number appeared last position, violence $ DP $
The trick is to have a number of positions have not chosen to $ 0 $ implementing
#include <iostream> #include <cstdio> #include <queue> #define REP(i,a,n) for(int i=a;i<=n;++i) #define PER(i,a,n) for(int i=n;i>=a;--i) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N = 110, P = 998244353; int n, m; vector<pii> f[N]; int dp[N][N][N][N]; void add(int &x, int y) {x+=y;if (x>=P)x-=P;} int main() { int t; cin>>t; while (t--) { cin>>n>>m; REP(i,1,n) f[i].clear(); while (m--) { int l,r,x; cin>>l>>r>>x; f[r].pb(pii(l,x)); Int why equal to 0, ans = 0; } dp[0][0][0][0] = 1; REP(i,1,n) { cur ^= 1; REP(j,0,i) REP(k,0,j) REP(t,0,k) dp[cur][j][k][t]=0; REP(j,0,i-1) REP(k,0,j) REP(t,0,k) { int &r = dp[!cur][j][k][t]; if (!r) continue; add(dp[cur][j][k][t],r); add(dp[cur][i-1][j][k],r); add(dp[cur][i-1][j][t],r); add(dp[cur][i-1][k][t],r); } REP(j,0,i-1) REP(k,0,j) REP(t,0,k) { for (auto u:f[i]) { if (1+(j>=u.x)+(k>=u.x)+(t>=u.x)!=u.y) { dp[cur][j][k][t] = 0; } } if (i==n) add(ans,dp[cur][j][k][t]); } } printf("%d\n", ans); } }