546. Remove Boxes (HARD)

给定一个整数序列,每次删除其中连续相等的子序列,得分为序列长度的平方 求最高得分。

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];
     }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值