Leetcode(546)音楽の排除(動的プログラミング)

トピック:正方形のセットを提供します:各数字は色を表します。最高のスコアを取得するには、どの除去戦略を採用する必要がありますか?(nの正方形を削除するたびに、nの正方形と同じくらい多くのポイントを取得できると想定しています)
例:
入力:1,3,2,2,2,3,4,3,1
出力:23
(1)接続を削除します2の3、3 * 3 = 9ポイント、残りの1、3、3、4、3、1を取得
(2)4を排除して、1 * 1 = 1ポイント、および残りの1、3、3、3、1
( 3)接続された3 2を排除し、3 * 3 = 9ポイントと残りの1、1を
取得します(4)最後の2 1を排除し、2 * 2 = 4ポイントを取得します
(5)最後に、最高スコアは9+です9 + 1 + 4 = 23ポイント。

正方形が少ない場合でも、貪欲アルゴリズムを使用して結果を「推測」できますが、正方形が多い場合はそれほど簡単ではありません。この問題を解決するには、動的計画法を使用できます。正方形配列s [k]を想定します。動的方程式f [i] [j] [m](iはs [i]を意味し、jはs [j]を意味し、mはs [j]の後の要素の中でs [j]と同じ要素の数を意味し、 mはゼロから最大数までの任意の数を取ることができます)、私たちの最終的な目標はf [0] [s.length] [0]の値を求めることです。
動的プログラミングの方程式:
ここに画像の説明を挿入

 class Solution {
    
    
        public int removeBoxes(int[] boxes) 

            int length=boxes.length;
            int [][][]dp=new int[length][length][length];
            return recursion(boxes,dp,0,length-1,0);
        }
        private int recursion(int[]boxes,int[][][]dp,int start,int end,int theSame){
    
    
            if(end<start)
                return 0;
            if(dp[start][end][theSame]!=0)
                return dp[start][end][theSame];
            while(end>0&&boxes[end]==boxes[end-1]){
    
    
                end--;
                theSame++;
            }
            dp[start][end][theSame]=recursion(boxes,dp,start,end-1,0)+(theSame+1)*(theSame+1);
            for(int i=start;i<end;i++){
    
    
                if(boxes[i]==boxes[end]){
    
    
                    dp[start][end][theSame]=Math.max(dp[start][end][theSame],recursion(boxes,dp,start,i,theSame+1)+
                            recursion(boxes,dp,i+1,end,0));
                }
            }
            return dp[start][end][theSame];
        }
    }

おすすめ

転載: blog.csdn.net/CY2333333/article/details/108022676