[도전 12일차] 돌다리 건너기 - KOI 고등부 풀이
2020. 4. 13. 00:08ㆍPS/도전
※복습 :
문제 : BOJ 2602 돌다리 건너기
사용 알고리즘 : DP
풀이:
전형적인 DP 문제다.
1. DP 정의를 하자.
DP(c, r, k) => c번째 열,r(0or1)번 행부터 문자열 끝까지 k번째 글자부터 채워 나갈 때 나올 수 있는 경우의 수
2. 점화식을 세우자
DP(c, r, k) = DP(c+1,r,k) + DP(c+1, !r, k+1)
단, DP(c+1,!r,k+1) 은 c번째 k번 행이 k번째 문자일 때만 적용된다.
3. 구현을 하자.
자열의 길이가 100 정도로 아주 작으므로 재귀함수 + 메모이제이션으로 구현하자. (직관적이다.)
코드
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//pentagon@sasa.hs.kr
#include<bits/stdc++.h>
#define ll long long
#define vsort(v) sort(v.begin(),v.end());
const int INF = 1e9;
using namespace std;
string goal,s[2];
int DT[101][2][21];
int solve(int c,int r,int k){
if(k>=goal.length()) return 1;
if(c>=s[r].length()) return 0;
if(DT[c][r][k])
return DT[c][r][k];
int ans=solve(c+1,r,k);
if(s[r][c]==goal[k])
ans+=solve(c+1,!r,k+1);
return DT[c][r][k]=ans;
}
int main(){
ios::sync_with_stdio(false); cin.tie(0);
cin>>goal>>s[0]>>s[1];
cout<<solve(0,0,0)+solve(0,1,0);
}
|
cs |
풀이가 평화롭다. 힐링 되는 시간이었다.
기존에는 가장 효율적인 풀이만 찾았는데, 문제를 풀다보니 정말 많은 문제를 빠른 시간 안에 풀 실력을 갖추고 싶다면 오히려 직관적이지만 느린 풀이, 긴 풀이가 공부할 때 효율적이라는 것을 깨달았다.
물론 현재에 충실하고 싶다면 백준에서 다른 분들의 동적 계획법 코드를 보는 것을 추천한다.
728x90
'PS > 도전' 카테고리의 다른 글
[도전 14일차] 양팔저울 - KOI 고등부 풀이 (0) | 2020.04.14 |
---|---|
[도전 13일차] 잠수함 식별 - KOI 고등부 풀이 (2) | 2020.04.13 |
(※도전 완료) [도전 11일차] 백준 6990 달팽이 (0) | 2020.04.09 |
[도전 10일차] 백준 2300 기지국 (0) | 2020.04.08 |
[도전 9일차] 2541 점 (0) | 2020.04.07 |