<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)546:移除盒子

          共 2052字,需瀏覽 5分鐘

           ·

          2022-03-10 17:15

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?移除盒子,我們先來看題面:
          https://leetcode-cn.com/problems/remove-boxes/

          You are given several boxes with different colors represented by different positive numbers.


          You may experience several rounds to remove boxes until there is no box left. Each time you can choose some continuous boxes with the same color (i.e., composed of k boxes, k >= 1), remove them and get k * k points.


          Return the maximum points you can get.


          給出一些不同顏色的盒子 boxes ,盒子的顏色由不同的正數(shù)表示。

          你將經(jīng)過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續(xù) k 個(gè)盒子(k >= 1),這樣一輪之后你將得到 k * k 個(gè)積分。

          返回 你能獲得的最大積分和 。

          示例? ? ? ? ? ? ? ? ? ? ? ? ?

          示例 1:

          輸入: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 分)

          示例 2:

          輸入:boxes = [1,1,1]
          輸出:9

          示例 3:

          輸入:boxes = [1]
          輸出:1


          解題

          https://blog.csdn.net/weixin_44171872/article/details/106891504

          方法1:動(dòng)態(tài)規(guī)劃

          主要思路:
          (1)三維動(dòng)態(tài)數(shù)組dp[ i ][ j ][ k ]表示子元素組從 i到j(luò) 的右側(cè)有 k 個(gè)連續(xù)的和boxes[ j ]相同的顏色;
          (2)對(duì)于每一個(gè)dp[ i ][ j ],先從最右端找連續(xù)的相同的顏色,為k個(gè),既dp[ i ][ j ][ k ],此時(shí)計(jì)算初值 dp[l][r][k]=dfs(boxes,l,r-1,0)+(k+1)*(k+1);既將最右側(cè)的k+1個(gè)消去后,加上前面的可能的處理結(jié)果;
          (3)然后從左端開始逐個(gè)找與右側(cè)連續(xù)的箱子相同的顏色,既若boxes[i]==boxes[r],則相當(dāng)于可以將原來的數(shù)組分成兩組,既先將中間的從 i+1到r-1 的子數(shù)組作為一組先消去, 既 dfs(boxes,i+1,r-1,0),再將剩下的作為一個(gè)整體處理,既dfs(boxes,l,i,k+1),故此時(shí)dp[ i ][ j ][ k ]的值可以為dp[l][r][k]=dfs(boxes,l,i,k+1)+dfs(boxes,i+1,r-1,0);從l 到 l遍歷重復(fù) (3)中的過程,并和(2)中的結(jié)果結(jié)合,找出最大值;

          class?Solution?{
          public:
          ????//題意中最大100
          ????int?dp[101][101][101];
          ????
          ????int?dfs(vector<int>&boxes,int?l,int?r,int?k){
          ??????//終止條件
          ????????if(l>r)
          ????????????return?0;
          ????????//先找出當(dāng)前的最右邊的連續(xù)相同的箱子
          ????????while(r>l&&boxes[r]==boxes[r-1]){
          ????????????--r;
          ????????????++k;
          ????????}
          ????????//若之前計(jì)算過,直接返回
          ????????if(dp[l][r][k]>0)
          ????????????return?dp[l][r][k];
          ????????//先計(jì)算(2)中的情況,既直接將最右邊的相同的箱子消去
          ????????dp[l][r][k]=dfs(boxes,l,r-1,0)+(k+1)*(k+1);
          ????????
          ????????//計(jì)算(3)中的情況,既在左邊的數(shù)組中找出可以和右側(cè)連續(xù)的箱子結(jié)合的情形
          ????????for(int?i=l;i????????????if(boxes[i]==boxes[r]){
          ????????????????dp[l][r][k]=max(dp[l][r][k],dfs(boxes,l,i,k+1)+dfs(boxes,i+1,r-1,0));
          ????????????}
          ????????}
          ????????//返回當(dāng)前情形
          ????????return?dp[l][r][k];
          ????}
          ????
          ????int?removeBoxes(vector<int>& boxes)?{
          ????????return?dfs(boxes,0,boxes.size()-1,0);
          ????}
          };


          好了,今天的文章就到這里,如果覺得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:

          LeetCode1-540題匯總,希望對(duì)你有點(diǎn)幫助!
          LeetCode刷題實(shí)戰(zhàn)541:反轉(zhuǎn)字符串 II
          LeetCode刷題實(shí)戰(zhàn)542:01 矩陣
          LeetCode刷題實(shí)戰(zhàn)543:二叉樹的直徑
          LeetCode刷題實(shí)戰(zhàn)544:輸出比賽匹配對(duì)
          LeetCode刷題實(shí)戰(zhàn)545:二叉樹的邊界

          瀏覽 83
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三级av一区 | www射www | 俺来了俺去了www色官网 | 青青草乱伦视频 | 亚洲激情久久 |