给定一些不同颜色的盒子,以不同的正整数表示。
消去连续相同颜色的盒子,直到全部消除完毕为止。每一次消去可以得到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