UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#202231#2972. 被操纵的淘汰赛tkswls100524ms16100kbC++111.4kb2024-02-14 10:53:282024-02-14 12:26:37

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, f[35][35][45][45], sum[35][35][45][45]; //区间 (理论)最小可行 最大值
int b[35][45], c[35];
char cc;
const int mod = 998244353;
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> c[i];
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> cc;
			b[i][j] = cc - '0';
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			for (int k = 1; k <= m; k++) {
				if (b[i][k] && (c[i] == 2 || ((k >= j) == c[i]))) {
					f[i][i][j][k] = 1;
				}
				sum[i][i][j][k] = sum[i][i][j][k - 1] + f[i][i][j][k];
			}
		}
	}
	int op;
	for (int len = 2; len <= n; len++) {
		for (int l = 1, r = len; r <= n; l++, r++) {
			for (int p = 1; p <= m; p++) {
				for (int q = 1; q <= m; q++) {
					for (int i = l; i <= r; i++) {
						if (b[i][q] && (c[i] == 2 || ((q >= p) == c[i]))) {
							op = 1;
							if (l <= i - 1) {
								op = op * sum[l][i - 1][max(p, q - ((i - 1) - l))][q - 1] % mod;
							}
							if (i + 1 <= r) {
								op = op * sum[i + 1][r][max(p, q - (r - (i + 1)))][q] % mod;
							}
							f[l][r][p][q] = (f[l][r][p][q] + op) % mod;
						}
					}
					sum[l][r][p][q] = (sum[l][r][p][q - 1] + f[l][r][p][q]) % mod;
				}
			}
		}
	}
	op = 0;
	cout << sum[1][n][1][m];
}

Details

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 0ms
memory: 1416kb

input:

5 5
2 2 1 1 2
11111
10111
11111
11011
11111

output:

599

result:

ok 1 number(s): "599"

Test #2:

score: 10
Accepted
time: 1ms
memory: 1420kb

input:

5 5
2 1 0 2 0
11111
11111
11011
11111
11101

output:

330

result:

ok 1 number(s): "330"

Test #3:

score: 10
Accepted
time: 19ms
memory: 16084kb

input:

30 40
2 1 2 2 2 2 1 2 2 2 2 2 2 0 2 2 2 2 2 2 0 2 2 2 2 2 1 2 2 2
0000000000000000000000000010000000...

output:

663552

result:

ok 1 number(s): "663552"

Test #4:

score: 10
Accepted
time: 11ms
memory: 16088kb

input:

30 40
0 2 2 2 2 2 1 2 2 2 1 2 2 2 0 1 2 2 2 0 2 2 2 2 2 2 2 2 2 1
0100000000000000000010000001000000...

output:

2737152

result:

ok 1 number(s): "2737152"

Test #5:

score: 10
Accepted
time: 82ms
memory: 16100kb

input:

30 40
1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
1011111111111101111111101111111111...

output:

969418599

result:

ok 1 number(s): "969418599"

Test #6:

score: 10
Accepted
time: 78ms
memory: 16100kb

input:

30 40
1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
1111111111111111110111111111111111...

output:

671699350

result:

ok 1 number(s): "671699350"

Test #7:

score: 10
Accepted
time: 96ms
memory: 16096kb

input:

30 40
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
1110111111111111111011011111111111...

output:

589133019

result:

ok 1 number(s): "589133019"

Test #8:

score: 10
Accepted
time: 81ms
memory: 16096kb

input:

30 40
0 2 2 1 2 2 2 2 0 2 2 2 2 2 1 2 2 0 2 0 2 2 2 1 1 2 2 2 1 1
1111111111111111111111111111011111...

output:

654238557

result:

ok 1 number(s): "654238557"

Test #9:

score: 10
Accepted
time: 74ms
memory: 16100kb

input:

30 40
0 2 2 2 2 2 2 0 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2
1101111001111111100111111010111011...

output:

741444602

result:

ok 1 number(s): "741444602"

Test #10:

score: 10
Accepted
time: 82ms
memory: 16096kb

input:

30 40
2 2 2 2 2 2 0 0 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
1111111111111111111101111110111111...

output:

338970706

result:

ok 1 number(s): "338970706"

Extra Test:

score: 0
Extra Test Passed