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

C++에서 배열을 엄격하게 증가시키십시오.

<시간/>

정수를 저장할 수 있는 두 개의 배열 rr1과 arr2가 있다고 가정합니다. arr1을 엄격하게 증가시키는 데 필요한 최소 작업 수를 찾아야 합니다. 여기에서 두 개의 인덱스 0 <=i 배열 arr1이 엄격하게 증가하도록 caPending-3n하지 않으면 -1을 반환합니다.

따라서 입력이 arr1 =[1,5,3,7,8], arr2 =[1,3,2,5]와 같으면 출력은 1이 됩니다. 5를 2로 바꿀 수 있기 때문입니다. 배열은 [1,2,3,7,8]이 됩니다.

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

  • 함수 solve()를 정의하면 배열 arr1, 배열 arr2, i, j, prev, 하나의 2D 배열 dp,

    가 사용됩니다.
  • i>=arr1의 크기이면 -

    • 1 반환

  • j =arr2[j] 및 상위

    의 arr2 부분배열의 첫 번째 요소
  • dp[i, j]가 -1과 같지 않으면 -

    • 반환 dp[i, j]

  • ret :=arr2의 크기 + 1

  • 이전

    • ret :=ret 및 solve(arr1, arr2, i + 1, j, arr1[i], dp)의 최소값

  • j

    • ret :=ret와 1의 최소값 + solve(arr1, arr2, i + 1, j, arr2[j], dp)

  • 반환 dp[i, j] =ret

  • 기본 방법에서 다음을 수행하십시오 -

  • 배열 arr2 정렬

  • n :=arr1의 크기

  • m :=arr2의 크기

  • 2005 x 2005 크기의 2D 배열 dp 하나를 정의하고 이것을 -1로 채웁니다.

  • ret :=해결(arr1, arr2, 0, 0, -inf, dp)

  • 반환(ret> 크기가 arr2이면 -1, 그렇지 않으면 ret - 1)

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

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(vector<int>& arr1, vector<int>& arr2, int i, int j, int prev, vector<vector<int> >& dp){
      if (i >= arr1.size())
         return 1;
      j = upper_bound(arr2.begin() + j, arr2.end(), prev) - arr2.begin();
      if (dp[i][j] != -1)
         return dp[i][j];
      int ret = arr2.size() + 1;
      if (prev < arr1[i]) {
         ret = min(ret, solve(arr1, arr2, i + 1, j, arr1[i], dp));
      }
      if (j < arr2.size()) {
         ret = min(ret, 1 + solve(arr1, arr2, i + 1, j, arr2[j], dp));
      }
      return dp[i][j] = ret;
   }
   int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2){
      sort(arr2.begin(), arr2.end());
      int n = arr1.size();
      int m = arr2.size();
      vector<vector<int> > dp(2005, vector<int>(2005, -1));
      int ret = solve(arr1, arr2, 0, 0, INT_MIN, dp);
      return ret > arr2.size() ? -1 : ret - 1;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,5,3,7,8}, v1 = {1,3,2,5};
   cout << (ob.makeArrayIncreasing(v,v1));
}

입력

{1,5,3,7,8}, {1,3,2,5}

출력

1