工作计划的最低难度

你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 <= j < i)。
你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大难度。
给你一个整数数组 jobDifficulty 和一个整数 d,分别代表工作难度和需要计划的天数。第 i 项工作的难度是 jobDifficulty[i]。
返回整个工作计划的 最小难度 。如果无法制定工作计划,则返回 -1 。

1. 二维动态规划(记忆化搜索)

class Solution {
public:
    vector<vector<int>> dp;//dp[i][j]表示从第i项工作开始,工作j天的最小难度
    int minDifficulty(vector<int>& jobDifficulty, int d) {
        int n = jobDifficulty.size();
        if(n<d) return -1;
        dp.resize(n,vector<int>(d+1,INT_MAX));
        for(int i=n-1,curmax=0;i>=0;i--){//初始化边界条件,只剩一天的情况
            curmax = max(curmax,jobDifficulty[i]);
            dp[i][1] = curmax;
        }
        for(int day = 1,sum = 0;day<=d;day++){//初始化边界条件,剩余天数跟任务数相同
            sum+=jobDifficulty[n-day];
            dp[n-day][day] = sum;
        }
        return mindif(jobDifficulty,d,0);
    }
    int mindif(vector<int>& job,int d,int start){
        if(dp[start][d]!=INT_MAX) return dp[start][d];
        int curmax = 0;
        for(int i=start;i<job.size();i++){//把第i天作为结束天
            if(i+d>job.size()) break;
            curmax = max(curmax,job[i]);
            dp[start][d] = min(dp[start][d],curmax+mindif(job,d-1,i+1));
        }
        return dp[start][d];
    }

};

posted @ 2023-05-16 10:27  失控D大白兔  阅读(9)  评论(0编辑  收藏  举报