2019 HDU 멀티 스쿨 1차전 BLANK DP

2785 단어
제목: 네 가지 숫자가 있는데, 지금은 몇 가지 제한 조건이 있다. 구간마다 다른 숫자의 종류는 반드시 몇 가지여야 하며, 합법적인 방안의 수를 물어야 한다.
사고방식: dp[i][j][k][t]를 정의하면 앞의 t개의 위치를 채운 후 {0,1,2,3} 이 네 개의 숫자가 마지막으로 나타난 위치를 나타낸다. 순서가 i,j,k,t(i코드:
#include 
#define pii pair
using namespace std;
const int maxn = 101;
const int mod = 998244353;
int dp[2][maxn][maxn][maxn];
vector re[maxn];
int main() {
	int T, x, y, z, n, m;
	scanf("%d", &T);
	while(T--) {
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= n; i++)
			re[i].clear();
		for (int i = 1; i <= n; i++)
			re[i].clear();
		for (int i = 1; i <= m; i++) {
			scanf("%d%d%d", &x, &y, &z);
			re[y].push_back(make_pair(x, z));
		}
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j <= n; j++)
				for (int k = 0; k <= n; k++)
					for (int t = 0; t <= n; t++)
						dp[i][j][k][t] = 0;
		}
		for (int j = 0; j <= n; j++)
			for (int k = 0; k <= j; k++)
				for (int t = 0; t <= k; t++)
					dp[0][j][k][t] = 0;
		dp[0][0][0][0] = 1;
		for (int i = 1; i <= n; i++) {
			for (int j = 0; j <= i; j++)
				for (int k = 0; k <= j; k++)
					for (int t = 0; t <= k; t++)
						dp[i & 1][j][k][t] = 0;
			for (int j = 0; j <= i; j++)
				for (int k = 0; k <= j; k++)
					for (int t = 0; t <= k; t++) {
						int p = (i & 1) ^ 1;
						dp[i & 1][j][k][t] = (dp[i & 1][j][k][t] + dp[p][j][k][t]) % mod;
						dp[i & 1][i - 1][k][t] = (dp[i & 1][i - 1][k][t] + dp[p][j][k][t]) % mod;
						dp[i & 1][i - 1][j][t] = (dp[i & 1][i - 1][j][t] + dp[p][j][k][t]) % mod;
						dp[i & 1][i - 1][j][k] = (dp[i & 1][i - 1][j][k] + dp[p][j][k][t]) % mod;
					}
			for (int j = 0; j <= i; j++)
				for (int k = 0; k <= j; k++)
					for (int t = 0; t <= k; t++) {
						for (int t1 = 0; t1 < re[i].size(); t1++) {
							if(1 + (j >= re[i][t1].first) + (k >= re[i][t1].first) + (t >= re[i][t1].first) != re[i][t1].second) {
								dp[i & 1][j][k][t] = 0;
							}
						}
					}
		}
		int ans = 0;
		for (int i = 0; i <= n; i++)
			for (int j = 0; j <= i; j++)
				for (int k = 0; k <= j; k++)
					ans = (ans + dp[n & 1][i][j][k]) % mod;
		printf("%d
", ans); } }

  
전재 대상:https://www.cnblogs.com/pkgunboat/p/11241228.html

좋은 웹페이지 즐겨찾기