题意
有一行方块,每个方块有颜色,现在可以把相邻的k个并且颜色相同的方块消除,得分为 k⋅k ,求最大得分。
思路
首先,做一步预处理优化时间:将相邻并且颜色相同的方块合并成段,用 c[i] 和 len[i] 分别记录这个段的颜色和里面的方块数目。于是以下的操作都是针对段进行。
状态表示:
d[i,j,k]
,区间
[i,j]
内,并且
j
段之后还有
转移方程:
第
继续积累第
j
段(将
时间复杂度: O(n4)
代码
const int maxn = 105;
int d[maxn][maxn][maxn];
class Solution {
private:
int c[maxn], len[maxn];
public:
int dfs(int i, int j, int k) {
if (d[i][j][k] != -1) return d[i][j][k];
if (i > j) return 0;
d[i][j][k] = dfs(i, j - 1, 0) + (len[j] + k) * (len[j] + k);
for (int pos = i; pos < j; pos++) {
if (c[pos] == c[j]) d[i][j][k] = max(d[i][j][k], dfs(i, pos, len[j] + k) + dfs(pos + 1, j - 1, 0));
}
return d[i][j][k];
}
int removeBoxes(vector<int>& boxes) {
int n = 0;
memset(c, 0, sizeof(c));
memset(len, 0, sizeof(len));
memset(d, -1, sizeof(d));
for (int i = 0; i < boxes.size(); i++) {
if (i == 0 || boxes[i] != boxes[i - 1]) c[++n] = boxes[i], len[n] = 1;
else len[n]++;
}
return dfs(1, n, 0);
}
};