Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 k일 동안 작업을 완료하는 데 필요한 최소 어려움 합계를 찾는 프로그램

<시간/>

job이라는 숫자 목록과 또 다른 값 k가 있다고 가정합니다. 이제 우리는 k개의 다른 날에 모든 작업을 끝내고 싶습니다. 작업은 주어진 순서대로 수행되어야 하며 매일 하나의 작업을 완료해야 합니다. 작업 i의 난이도는 작업[i]에 저장되며 하루에 작업 목록을 완료하는 난이도는 그날 수행한 최대 난이도 작업이 됩니다. 따라서 우리는 k일 동안 작업을 수행하는 데 어려움의 최소 합을 찾아야 합니다.

따라서 입력이 작업 =[2, 3, 4, 6, 3] k =2와 같으면 출력은 8이 됩니다. 처음에는 [2]를 수행한 다음 [3, 4, 6, 3]을 수행합니다. 따라서 난이도는 2 + 최대 (3, 4, 6, 3) =8입니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 505 x 15 크기의 배열 dp를 정의합니다.
  • dfs() 함수를 정의하면 시작, k, 배열 v가 필요합니다.
  • 시작>=v의 크기이면 -
    • 반환(k가 0과 같으면 0, 그렇지 않으면 inf)
  • k <0이면 -
    • 반환 정보
  • dp[start, k]가 -1과 같지 않으면 -
    • dp[start, k]를 반환
  • ret :=inf
  • 값:=0
  • 초기화 i :=시작, i
  • val :=val 및 v[i]의 최대값
  • ret :=ret의 최소값 및 (val + dfs(i + 1, k - 1, v))
  • dp[start, k] =ret
  • 반환
  • 메인 방법에서 다음을 수행하십시오 -
  • dp를 -1로 채우기
  • dfs(0, k, 작업) 반환
  • 예시(C++)

    이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

    #include <bits/stdc++.h>
    using namespace std;
    const int inf = 1e6;
    int dp[505][15];
    int dfs(int start, int k, vector <int>& v){
       if(start >= v.size()){
          return k == 0 ? 0 : inf;
       }
       if(k < 0)
          return inf;
       if(dp[start][k] != -1)
          return dp[start][k];
       int ret = inf;
       int val = 0;
       for(int i = start; i < v.size(); i++){
          val = max(val, v[i]);
          ret = min(ret, val + dfs(i + 1, k - 1, v));
       }
       return dp[start][k] = ret;
    }
    int solve(vector<int>& jobs, int k) {
       memset(dp ,-1, sizeof dp);
       return dfs(0, k, jobs);
    }
    int main(){
       vector<int> v = {2, 3, 4, 6, 3};
       int k = 2;
       cout << solve(v, k);
    }

    입력

    {2, 3, 4, 6, 3}, 2

    출력

    8