美文网首页
Remove Boxes

Remove Boxes

作者: 我叫胆小我喜欢小心 | 来源:发表于2017-06-13 20:54 被阅读120次

    题目来源
    一个数组,里面不同的数字,然后每次取连续的k个同样数字,得分k*k,然后问怎么取得分最高。
    没想到怎么用DP来做,感觉这个确实很难想。
    memo[l][r][k]表示有k个后缀和nums[r]一样的情况下l到r得分最大。
    memo[l][r][k] = max(memo[l][r][k], memo[l][i][k+1], memo[i+1][r-1][0])
    解释的不太清楚,大家可以直接看讨论区。
    最后输出的结果是memo[0][n-1][0]

    class Solution {
    public:
        int removeBoxes(vector<int>& boxes) {
            int memo[100][100][100] = {0};
            return dfs(boxes, memo, 0, boxes.size()-1, 0);
        }
        
        int dfs(vector<int>& boxes, int memo[100][100][100], int l, int r, int k)
        {
            if (l > r) 
                return 0;
            if (memo[l][r][k] != 0)
                return memo[l][r][k];
            while (r > l && boxes[r] == boxes[r-1]) {
                r--;
                k++;
            }
            memo[l][r][k] = dfs(boxes, memo, l, r-1, 0) + (k + 1) * (k + 1);
            for (int i=l; i<r; i++) {
                if (boxes[i] == boxes[r])
                    memo[l][r][k] = max(memo[l][r][k], dfs(boxes, memo, l, i, k + 1) + dfs(boxes, memo, i + 1, r - 1, 0));
            }
            return memo[l][r][k];
        }
    };
    

    相关文章

      网友评论

          本文标题:Remove Boxes

          本文链接:https://www.haomeiwen.com/subject/ykjjqxtx.html