1 条题解
-
0
#include <bits/stdc++.h> using namespace std; int n; int col[55]; int num[55]; // [l,r] 区间消除完,且 l 方块额外增加了 w 个的最优得分 int book[55][55][20 * 50]; int f(int l, int r, int w) { if (l > r) return 0; if (book[l][r][w]) return book[l][r][w]; // 只有一个方块时直接消除 if (l == r) return book[l][r][w] = (num[l] + w) * (num[l] + w); // 找所有方案的最优值 int ans = 0; // l 方块自己消除 ans = (num[l] + w) * (num[l] + w) + f(l + 1, r, 0); // 考虑 l 和谁合并了 for (int i = l + 1; i <= r; i++) { if (col[l] == col[i]) { // [l] [l+1 ~ i-1] [i] [i+1 ~ r] // 可以把 l 对应的区域留到最后消除,这样 [i] 就会合并到一起 ans = max(ans, f(l, i - 1, w + num[i]) + f(i + 1, r, 0)); } } return book[l][r][w] = ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> col[i]; for (int i = 1; i <= n; i++) cin >> num[i]; cout << f(1, n, 0); return 0; }
- 1
信息
- ID
- 13394
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 4
- 上传者