[Hdfs] lc1723. 完成所有工作的最短时间(dfs+状压dp+周赛223_4)

1. 题目来源

链接:1723. 完成所有工作的最短时间

2. 题目解析

本题正解应该是状压 dp,但由于好久好久没弄困难的 dp 问题了,手太生。这个 n 又这么小,还是暴搜会比较香。
在这里插入图片描述
每个数两种情况,要么加到现有组中,要么自成一组。也快到临界值了,得加上剪枝优化,dfs() 参数存一个最大值,不要自己循环求最大值这妥妥超时,也不要用 min() 来更新最大值,这样就不是剪枝了。当传递的参数最大值还没全局最大值小的时候,后面的情况都不需要再考虑了,直接 return 即可,加上剪枝优化后速度直接飞起。


  • 时间复杂度 O ( 不 会 分 析 ) O(不会分析) O()
  • 空间复杂度 O ( 不 会 分 析 ) O(不会分析) O()

代码:

class Solution {
    
    
public:
    vector<int> jobs;
    vector<int> s;
    int res = 1e9;

    void dfs(int a, int b, int c) {
    
             // 枚举到第a项工作,当前有b组,当前方案的最大时间为c
        if (c > res) return ;
        if (a == jobs.size()) {
    
    
            res = c;
            return ;
        }

        for (int i = 0; i < b; i ++ ) {
    
         // 分到现有组中
            s[i] += jobs[a];
            dfs(a + 1, b, max(c, s[i]));
            s[i] -= jobs[a];
        }

        if (b < s.size()) {
    
                     // 自成新组,但不能超过限制组数
            s[b] = jobs[a];
            dfs(a + 1, b + 1, max(c, s[b]));
            s[b] = 0;
        }
    }

    int minimumTimeRequired(vector<int>& _jobs, int k) {
    
    
        jobs = _jobs;
        s.resize(k);
        dfs(0, 0, 0);
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/yl_puyu/article/details/112724674
今日推荐