C语言 | Leetcode C语言题解之第546题移除盒子
题目:
题解:
int dp[100][100][100];
int calculatePoints(int* boxes, int l, int r, int k) {
if (l > r) {
return 0;
}
if (dp[l][r][k] == 0) {
int r1 = r, k1 = k;
while (r1 > l && boxes[r1] == boxes[r1 - 1]) {
r1--;
k1++;
}
dp[l][r][k] = calculatePoints(boxes, l, r1 - 1, 0) + (k1 + 1) * (k1 + 1);
for (int i = l; i < r1; i++) {
if (boxes[i] == boxes[r1]) {
dp[l][r][k] = fmax(dp[l][r][k], calculatePoints(boxes, l, i, k1 + 1) + calculatePoints(boxes, i + 1, r1 - 1, 0));
}
}
}
return dp[l][r][k];
}
int removeBoxes(int* boxes, int boxesSize) {
memset(dp, 0, sizeof dp);
return calculatePoints(boxes, 0, boxesSize - 1, 0);
}