546 Remove Boxes 移除盒子
给定一些不同颜色的盒子,以不同的正整数表示。
消去连续相同颜色的盒子,直到全部消除完毕为止。每一次消去可以得到k * k分(k为消去盒子的个数, k >= 1)。
计算可以得到的最大得分。
注意:盒子的数量n不超过100。
详见:https://leetcode.com/problems/remove-boxes/description/
C++:
class Solution { public: int removeBoxes(vector<int>& boxes) { int n = boxes.size(); int dp[100][100][100] = {0}; return helper(boxes, 0, n - 1, 0, dp); } int helper(vector<int>& boxes, int i, int j, int k, int dp[100][100][100]) { if (j < i) { return 0; } if (dp[i][j][k] > 0) { return dp[i][j][k]; } int res = (1 + k) * (1 + k) + helper(boxes, i + 1, j, 0, dp); for (int m = i + 1; m <= j; ++m) { if (boxes[m] == boxes[i]) { res = max(res, helper(boxes, i + 1, m - 1, 0, dp) + helper(boxes, m, j, k + 1, dp)); } } return dp[i][j][k] = res; } };
参考:http://www.cnblogs.com/grandyang/p/6850657.html