Hang a school more than 2019 electric A Blank (dp)

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);
	}
}

 

Guess you like

Origin www.cnblogs.com/uid001/p/11228589.html