Leetcode每日一題(1)
阿新 • • 發佈:2020-08-15
546. 移除盒子
給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。
你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子(k >= 1),這樣一輪之後你將得到 k*k
個積分。
當你將所有盒子都去掉之後,求你能獲得的最大積分和。
示例:
輸入:boxes = [1,3,2,2,2,3,4,3,1] 輸出:23 解釋: [1, 3, 2, 2, 2, 3, 4, 3, 1] ----> [1, 3, 3, 4, 3, 1] (3*3=9 分) ----> [1, 3, 3, 3, 1] (1*1=1 分) ----> [1, 1] (3*3=9 分) ----> [] (2*2=4 分)
提示:
1 <= boxes.length <= 100
1 <= boxes[i] <= 100
分析
一般來說,求最值的問題幾乎和動態規劃有關係,那麼這題也是從動態規劃的角度去思考解決方案。
程式碼
class Solution { int len; int removeBoxes(vector<int>& boxes,int i,int j,int k,vector<vector<vector<int>>>& dp) { if(i > j) return 0; if(dp[i][j][k] > 0) return dp[i][j][k]; for(;i+1 <= j && boxes[i+1] == boxes[i];++i,++k); int res = (k+1) * (k+1) + removeBoxes(boxes,i+1,j,0,dp); for(int m = i + 1;m <= j;++m) if(boxes[m] == boxes[i]) res = max(res,removeBoxes(boxes,i+1,m-1,0,dp) + removeBoxes(boxes,m,j,k+1,dp)); return dp[i][j][k] = res; } public: int removeBoxes(vector<int>& boxes) { len = boxes.size(); // dp[i][j][k] 表示從i到j的範圍有k個相同顏色的數字在i的前面,並且下標i的顏色也與它們相同 vector<vector<vector<int>>> dp(len+1,vector<vector<int>>(len+1,vector<int>(len+1,0))); return removeBoxes(boxes,0,len-1,0,dp); } };