[NOIP 2024 模拟2]数组操作
[NOIP 2024 模拟2]数组操作
题意
有
思路
发现把一个位置变成
定义
第一个转移方程显然。第二个转移方程的
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 998244353;
const int N = 2e3 + 5;
int n, a[N], pre[N], suf[N];
ll cnt[N][N], dp[N][N], c[N][N];
void solve() {
cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i];
c[0][0] = 1;
for (int i = 1; i <= n; i ++) {
c[i][0] = 1;
for (int j = 1; j <= n; j ++) {
c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
c[i][j] %= mod;
}
}
for (int i = 0; i <= n + 1; i ++)
for (int j = 0; j <= n + 1; j ++) cnt[i][j] = 1;
for (int k = 1; k <= n; k ++) {
for (int i = 1; i <= n; i ++) {
int j = i + k - 1;
if (j > n) break;
pre[i - 1] = 0, suf[j + 1] = 0;
for (int t = i; t <= j; t ++) pre[t] = max(pre[t - 1], a[t]);
for (int t = j; t >= i; t --) suf[t] = max(suf[t + 1], a[t]);
dp[i][j] = 1e9, cnt[i][j] = 0;
for (int t = i; t <= j; t ++)
dp[i][j] = min(dp[i][j], dp[i][t - 1] + dp[t + 1][j] + pre[t - 1] + suf[t + 1]);
for (int t = i; t <= j; t ++)
if (dp[i][t - 1] + dp[t + 1][j] + pre[t - 1] + suf[t + 1] == dp[i][j])
cnt[i][j] += cnt[i][t - 1] * cnt[t + 1][j] % mod * c[j - i][j - t] % mod, cnt[i][j] %= mod;
}
}
cout << cnt[1][n] << "\n";
}
signed main() {
freopen("arr.in", "r", stdin);
freopen("arr.out", "w", stdout);
int Case = 1;
// cin >> Case;
while (Case --)
solve();
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18410934,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具