정수를 저장할 수 있는 두 개의 배열 rr1과 arr2가 있다고 가정합니다. arr1을 엄격하게 증가시키는 데 필요한 최소 작업 수를 찾아야 합니다. 여기에서 두 개의 인덱스 0 <=i
따라서 입력이 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