1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int MAXN = 300; // MAXM==MAXN int n, m; int a[MAXN + 5]; set<int> D; // dp[l][r] a[l]~a[r] 最多消除的数量 int dp[MAXN + 5][MAXN + 5]; void work() { cin >> n >> m; for (int i = 1; i <= n; i++) cin >> a[i]; D.clear(); for (int i = 1; i <= m; i++) { int d; cin >> d; D.insert(d); } // dp[i][i-1] 是长度为 0 的区间 for (int l = 1; l <= n; l++) for (int r = l - 1; r <= n; r++) dp[l][r] = 0; // 区间dp for (int len = 2; len <= n; len++) for (int l = 1; l + len - 1 <= n; l++) { int r = l + len - 1; // 直接分两边 l~i i+1~r for (int i = l; i <= r - 1; i++) dp[l][r] = max(dp[l][r], dp[l][i] + dp[i + 1][r]); // 中间消完,头尾消除 if (dp[l + 1][r - 1] == (r - 1) - (l + 1) + 1 && D.find(a[r] - a[l]) != D.end()) dp[l][r] = max(dp[l][r], dp[l + 1][r - 1] + 2); // 中间挑个位置,消除 a[l],a[i],a[r] for (int i = l + 1; i <= r - 1; i++) { if (a[i] - a[l] == a[r] - a[i] && D.find(a[i] - a[l]) != D.end() && dp[l + 1][i - 1] == (i - 1) - (l + 1) + 1 && dp[i + 1][r - 1] == (r - 1) - (i + 1) + 1) dp[l][r] = max(dp[l][r], dp[l + 1][i - 1] + dp[i + 1][r - 1] + 3); } } cout << dp[1][n] << "\n"; } int main() { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; while (T--) work(); return 0; }
信息
- ID
- 13419
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 18
- 已通过
- 8
- 上传者