力扣練習-動態規劃

狗星發表於2024-04-27

線性DP

3122. 使矩陣滿足條件的最少操作次數

class Solution {
    /*
       問題分類:線性DP問題
       1.每一列元素值相同,相鄰列元素值不同,考慮按照列進行狀態列舉列舉
       2.0 <= grid[i][j] <= 9,值的範圍很小隻有10個
       3. f[i][j]可以為考慮前i列並且第i列元素為j的最少運算元目
        
    */
    public int minimumOperations(int[][] grid) {
        int row = grid.length,col = grid[0].length;

        int[][] cnt = new int[col][10];
        for(int r = 0;r < row;r++){
            for(int c = 0;c < col;c++){
                cnt[c][grid[r][c]]++;
            }
        }

        int[][] f = new int[col][10];
        for(int c = 0;c < col;c++){
            Arrays.fill(f[c],Integer.MAX_VALUE);
        }
        for(int v = 0;v < 10;v++){
            f[0][v] = row - cnt[0][v];
        }

        for(int c = 1;c < col;c++){
            for(int v = 0;v < 10;v++){
                for(int pv = 0;pv < 10;pv++){
                    if(pv == v){
                        continue;
                    }
                    f[c][v] = Math.min(f[c-1][pv] + (row - cnt[c][v]),f[c][v]); 
                }
            }
        }

        int res = Integer.MAX_VALUE;
        for(int v = 0;v < 10;v++){
            res = Math.min(res,f[col-1][v]);
        }

        return res;
    }
}

相關文章