20250826 cxm1024 noip 模拟赛1
T1
https://oj.ryp.org.cn/contest/11/problem/339
Solution
考虑贪心。
T2
https://oj.ryp.org.cn/contest/11/problem/340
Solution
先考虑直接暴力 dp。
设 \(f(i, j, k)\) 表示前 \(i\) 天,最大值为 \(j\),目前值为 \(k\) 的方案。
转移显然。
然后考虑一个数影响的是一段后缀,那么考虑直接倒着做。
那么我们的目前值就没必要记录了,然后就做完了。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 10, P = 998244353;
int n, a[N], f[N][N];
int main()
{
cin.tie(0)->ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++) {
char c; cin >> c;
if (c == '+') a[i] = 1;
if (c == '0') a[i] = 0;
if (c == '-') a[i] = -1;
if (c == '?') a[i] = 2;
}
f[n][0] = 1;
for (int i = n; i >= 1; i--) {
for (int j = 0; j <= n; j++) {
if (a[i] == 2) {
(f[i - 1][j + 1] += f[i][j]) %= P;
(f[i - 1][max(0, j - 1)] += f[i][j]) %= P;
(f[i - 1][j] += f[i][j]) %= P;
continue;
}
(f[i - 1][max(0, j + a[i])] += f[i][j]) %= P;
}
}
for (int i = 0; i <= n; i++) cout << f[0][i] << "\n";
return 0;
}

浙公网安备 33010602011771号