Remove Boxes

题目来源
一个数组,里面不同的数字,然后每次取连续的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& boxes) {
        int memo[100][100][100] = {0};
        return dfs(boxes, memo, 0, boxes.size()-1, 0);
    }
    
    int dfs(vector& 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

你可能感兴趣的:(Remove Boxes)