给定一个整数序列,每次删除其中连续相等的子序列,得分为序列长度的平方 求最高得分。
dp方程如下:
memo[l][r][k] = max(memo[l][r][k], dfs(boxes,memo,l,i,k+1) + dfs(boxes,memo,i+1,r-1,0));
意思是在序列的l-r部分后接k长度的 r值序列 所能得到的最大得分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class
Solution {
public
:
int
removeBoxes(vector<
int
>& boxes) {
int
n=boxes.size();
int
memo[100][100][100] = {0};
return
dfs(boxes,memo,0,n-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];
}
};
|