3122.使矩阵满足条件的最少操作次数

周赛第三题,知道要用动态规划,但是不知道怎么回到子问题

显然根据题意我们需要让每一列都相同,但是相邻列不能选择同一种数字,观察到数据nums[i]介于0-9,我们就以此为突破口.

首先我们用count[n][10], count[i][j]记录第i+1列值为j的元素个数,转移方程如下:

dfs(i,pre) = max(dfs(i-1,k) + count[i][k]) k=0,1...9 k!=pre;

表示 i 对应的那一列选择k的话, 再去判断i-1对应的那一列的元素

入口是dfs(n-1,10); 使用10是表示没有上一个,取0-9均可

代码如下: 这里写的是 记忆化回溯 ,可以自行改成二维dp

复制代码
class Solution {
public:
    int minimumOperations(vector<vector<int>>& grid) {
        int m=grid.size(),n=grid[0].size();
        int count[n][10]; //count[i][j] 表示 第i+1列里面值等于j的个数
        memset(count,0,sizeof(count));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                count[j][grid[i][j]]++;
            }
        } 
        int memo[n][11];
        memset(memo,-1,sizeof(memo));
        function<int(int,int)> dfs=[&](int i,int pre){  
            if(i==-1) return 0;
            int &res=memo[i][pre];
            if(res!=-1) return res;
            int cnt=0;
            for(int j=0;j<10;j++){
                if(j==pre) continue; 
                cnt=max(cnt,dfs(i-1,j)+count[i][j]);//[[1,6,7,3,0,4,1,3,7,5]]
            } 
            return res=cnt;
        };
        return m*n-dfs(n-1,10);
    }
};
相关推荐
Sakinol#7 小时前
Leetcode Hot 100 ——动态规划part02
算法·leetcode·动态规划
MORE_777 小时前
leecode-灌溉花园-贪心算法and动态规划
算法·贪心算法·动态规划
xiaoye-duck1 天前
《算法题讲解指南:动态规划算法--简单多状态dp问题》--13.删除并获得点数,14.粉刷房子
c++·算法·动态规划
liuyao_xianhui1 天前
优选算法_分治_快速排序_归并排序_C++
开发语言·数据结构·c++·算法·leetcode·排序算法·动态规划
闻缺陷则喜何志丹1 天前
【动态规划】P8591 『JROI-8』颅脑损伤 2.0|普及+
c++·算法·动态规划·洛谷
云淡风轻~窗明几净1 天前
关于TSP的P=NP解法:海岸线猜想SeaLine(再续之三)ubuntu lazarus sqlite
动态规划
闻缺陷则喜何志丹1 天前
【动态规划+前缀和+化环为链】P8810 [蓝桥杯 2022 国 C] 数组个数|普及+
c++·算法·前缀和·蓝桥杯·动态规划·洛谷·化环为链
tankeven1 天前
动态规划专题:00:线性动态规划:爬楼梯问题实例
c++·算法·动态规划
Tisfy1 天前
LeetCode 1594.矩阵的最大非负积:动态规划O(mn)
leetcode·矩阵·动态规划·dp
会编程的土豆2 天前
【数据结构与算法】LCS刷题
数据结构·算法·动态规划