핵심::
구현(?) 풀이
DP 태그 붙어 있어서 점화식 찾으려다 못찾고
결국 재귀로 풀이했다. ( Top Down 방식으로 풀이 했기 때문에 DP가 맞긴 하다 )
풀이::
이동 가능한 2개의 동전 배열과 초기 동전 배열에서 그 동전 2개를 뺀 배열 2개를 만든다
ex)
6
oooxxx
oxoxox
1 2
=> 이 경우, 각각의 배열은 다음과 같이 분리 된다.
arr1 = oxxx
arr2 = oo
이 분리된 배열들을 앞쪽부터 적절히 순서를 섞어 주어진 2번째 배열(예제 oxoxox)을 만들 수 있는지 여부를 검사하면 된다.
이 부분은 그냥 구현 쪽이고 두 배열의 몇번째 인덱스를 사용했을 때 결과가 정해지는지 여부만 DP 배열에 따로 저장했다.
의견::
DP 정해가 뭔지 궁금하다.
이게 왜 DP지
코드::
더보기
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int dp[10001][3];
int a1[9999];
int a2[3];
int arr[10001];
int n;
int r(int c1, int c2) {
int& ret = dp[c1][c2];
if(ret != 0) return ret;
int cur = c1 + c2;
if(cur == n) {
return ret = 1;
}
int r1 = -1, r2 = -1;
if(c1 < n - 2) {
if(arr[cur + 1] == a1[c1 + 1]) {
r1 = r(c1 + 1, c2);
}
}
if(c2 < 2) {
if(arr[cur + 1] == a2[c2 + 1]) {
r2 = r(c1, c2 + 1);
}
}
return ret = (r1 > r2 ? r1 : r2);
}
int main() {
cin >> n;
string s1, s2;
cin >> s1;
cin >> s2;
for(int i=1;i<=n;i++) {
arr[i] = s2[i - 1];
}
int n1, n2;
cin >> n1 >> n2;
n1 += 1;
n2 += 1;
a2[1] = s1[n1 - 1];
a2[2] = s1[n2 - 1];
for(int i=1;i<=n;i++) {
a1[i] = s1[i - 1];
}
for(int i=n2;i<=n;i++) {
a1[i] = a1[i + 1];
}
for(int i=n1;i<=n;i++) {
a1[i] = a1[i + 1];
}
int ret = r(0, 0);
cout << ((ret == 1) ? "YES" : "NO");
return 0;
}
'Algorithm > Algorithm 문제 풀이' 카테고리의 다른 글
[BAE/<JOON> 문제풀이] 7570. 줄 세우기 (0) | 2022.07.15 |
---|---|
[BAE/<JOON> 문제풀이] 2533. 사회망 서비스 (0) | 2022.07.15 |
[BAE/<JOON> 문제풀이] 14621. 나만 안되는 연애 (0) | 2022.07.15 |
[BAE/<JOON> 문제풀이] 1513. 경로 찾기 (0) | 2022.07.15 |
[BAE/<JOON> 문제풀이] 2146. 다리 만들기 (0) | 2022.07.15 |