잠재적으로 겹칠 수 있는 간격 목록(포함)이 있다고 가정합니다. 이제 하나의 간격을 삭제한 다음 나머지 간격을 병합하고 남은 간격의 수를 계산하는 작업이 있다고 가정합니다. 제거 후 가능한 남은 간격의 최대 수를 찾아야 합니다.
따라서 입력이 간격 =[ [5, 8], [6, 7], [7, 10], [9, 11]]과 같으면 출력은 2가 됩니다. 이는 -
-
간격 [5, 8]을 삭제하면 병합으로 [6, 11]이 됩니다.
-
간격 [6, 7]을 삭제하면 병합으로 [5, 11]이 됩니다.
-
간격 [7, 10]을 삭제하면 병합으로 [5, 8], [9, 11]이 됩니다.
-
간격 [9, 11]을 삭제하면 병합으로 [5, 10]이 됩니다.
따라서 [7, 10]을 제거하는 것이 좋습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
숫자 쌍의 배열 메모 정의,
-
countIntervals() 함수를 정의합니다. 이것은 하나의 2D 배열 간격, i, 끝이 필요합니다.
-
i가 간격의 크기와 같으면 -
-
0 반환
-
-
memo[i].first_element
이면 -
-무한대를 반환합니다.
-
-
memo[i].first_element가 end와 같으면 -
-
메모[i]의 두 번째 요소 반환
-
-
end <간격[i, 0]이면 -
-
메모[i] :=메모[i]의 끝과 첫째의 최소값, 1 + countIntervals(intervals, i + 1, interval[i, 1])
-
메모[i]의 두 번째 요소 반환
-
-
memo[i] :=memo[i] 및 countIntervals(intervals, i + 1, 간격[I, 1] 및 end의 최대값)의 끝과 첫 번째 요소의 최소값
-
메모[i]의 두 번째 값 반환
-
-
주요 방법에서 다음을 수행하십시오 -
-
간격 크기로 배열 메모 크기 조정
-
배열 간격 정렬
-
개수:=0, 결과:=0, 끝:=− 1
-
어레이 온도 정의
-
for i :=0 ~ i <간격 크기, 업데이트(i 1 증가), 수행 -
-
결과 :=결과 및 개수의 최대값 + countIntervals(intervals, i + 1,end)
-
end <간격[i, 0]이면 -
-
(1씩 증가)
-
-
끝 :=끝과 간격의 최대값[i, 1]
-
-
반환 결과
-
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; vector<pair<int, int>> memo; int countIntervals(vector<vector<int>>& intervals, int i, int end) { if (i == intervals.size()) return 0; if (memo[i].first < end) return INT_MIN; if (memo[i].first == end) return memo[i].second; if (end < intervals[i][0]) { memo[i] = {min(end, memo[i].first), 1 + countIntervals(intervals, i + 1, intervals[i][1])}; return memo[i].second; } memo[i] = {min(end, memo[i].first), countIntervals(intervals, i + 1, max(intervals[i][1], end))}; return memo[i].second; } int solve(vector<vector<int>>& intervals) { memo.clear(); memo.resize(intervals.size(), {INT_MAX, −1}); sort(intervals.begin(), intervals.end()); int count = 0, result = 0, end = −1; vector<int> temp; for (int i = 0; i < intervals.size(); i++) { result = max(result, count + countIntervals(intervals, i + 1, end)); if (end < intervals[i][0]) count++; end = max(end, intervals[i][1]); } return result; } int main(){ vector<vector<int>> v = {{5, 8}, {6, 7}, {7, 10}, {9, 11}}; cout<<solve(v); }
입력
{{5, 8}, {6, 7}, {7, 10}, {9, 11}}
출력
2