线性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;
}
}