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

原文地址:https://www.cnblogs.com/xidian2014/p/8921858.html