ソードフィンガーオファーインタビュー質問47:ギフトの最大値(動的計画法)

1次元配列を使用して値を記録する質問を行ったため、この質問は最初はかなり混乱します。この質問が前から後ろに最大の要素を選択してパスに追加する場合は、次の要素のサイズは引き続き合計サイズに影響します。結果は保証されません。

ただし、2次元配列を使用してiからjまでのパスの最大値を記録し、ノードiの値を記録する場合、jは上下のパスの最大値の最大値に等しくなります。左上隅から始めて、すべてのパスの最大値を取得できます。

右下隅の値を返すと、それだけです。

この質問では、前から後ろに向かって結果が得られます。この質問の漸化式はi = i [count + 1] + ...ではないため、前の質問のようなボトムアップはありません。現在の要素は、後続の要素を事前に知る必要はありません

私のコード

 

    int[][] p = null;
    public int maxValue(int[][] grid) {
        p = new int[grid.length][grid[0].length];
        for(int count_1 = 0; count_1<p.length ;count_1++){
            for(int count_2 = 0; count_2<p[0].length ;count_2++){
                p[count_1][count_2] = 0;
            }
        }
        int i = 0;
        int j = 0;
        while(i<p.length&&j<p[0].length){
            for(int count_2 = j;count_2<p[0].length;count_2++){
                findMax(grid,i,count_2);
            }
            for(int count_1 = i;count_1<p.length;count_1++){
                findMax(grid,count_1,j);
            }
            i++;
            j++;

        }
        

        return p[p.length-1][p[0].length-1];
    }
    public void findMax(int[][] grid,int i,int j){
        if(i==0&&j==0){
            p[i][j] = grid[i][j];
        }else if(i==0){
            p[i][j] = p[i][j-1] + grid[i][j];
        }else if(j==0){
            p[i][j] = p[i-1][j] + grid[i][j];
        }else{
            p[i][j] = p[i][j-1] > p[i-1][j]? p[i][j-1] + grid[i][j]:p[i-1][j] + grid[i][j];
        }
    }

最適化

この方法では、1次元配列を使用します。配列は1つずつ更新されるため、jの前に更新された現在の行の値は、j​​とjの後に更新されていない前の行の値になります。

    int[] max_val = new int[p[0].length];
    public int maxValue(int[][] grid) {
        p = new int[grid.length][grid[0].length];
        for(int count_1 = 0; count_1<p.length ;count_1++){
            for(int count_2 = 0; count_2<p[0].length ;count_2++){
                p[count_1][count_2] = 0;
            }
        }
        int i = 0;
        int j = 0;
        
            
            for(int count_1 = i;count_1<p.length;count_1++){
                for(int count_2 = j;count_2<p[0].length;count_2++){
                    findMax(grid,i,count_2);
                }
            }
            i++;
            j++;

        }
        

        return p[p.length-1][p[0].length-1];
    }
    public void findMax(int[][] grid,int i,int j){
        if(i==0&&j==0){
            max_val[j] = grid[i][j];
        }else if(i==0){
            max_val[j] = max_val[j-1] + grid[i][j];
        }else if(j==0){
            max_val[j] = max_val[j] + grid[i][j];
        }else{
            max_val[j] = max_val[j] > max_val[j-1]? max_val[j] + grid[i][j]:max_val[j-1] + grid[i][j];
        }
    }

 

 

おすすめ

転載: blog.csdn.net/qq_40473204/article/details/114579872