Today
Total
Archives
05-09 10:28
관리 메뉴

tony9402

[백준 9461] 파도반 수열 본문

알고리즘/Baekjoon Online Judge

[백준 9461] 파도반 수열

ssu_gongdoli 2019. 1. 23. 00:01
반응형

문제 : 파도반 수열


문제 유형 : 다이나믹 프로그래밍



이 문제는 규칙을 찾기만 하면 되는 문제이다.


난 두가지 점화식으로 풀었다.



1. 점화식1


일단 가장 먼저 풀었던 방식을 설명하자면, 소용돌이처럼 이어지는 수를 한 줄로 써보았다.


1 1 1 2 2 3 4 5 7 9 12 ...



이것을 보고 규칙이 바로 보였다. 지금 현재 위치에서 왼쪽으로 2칸 떨어진 것과 같은 방향으로 3칸 떨어진 것의 합이 현재 위치의 값과 같다는 점화식을 발견했다. 이를 식으로 쓰자면 아래와 같다.




이 식을 가지고 초기값만 잘 넣어주면 쉽게 맞추는 문제이다. 또한 n이 커지면 int형의 범위가 벗어나니 맞왜틀 했던 사람들은 int를 long long으로 바꿔보기 바란다.



- 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
 
using namespace std;
typedef long long ll;
 
ll dp[5000];
 
ll solve(int n)
{
    if (n <= 1)return n;
    else if (dp[n])return dp[n];
    else return (dp[n] = solve(n - 2+ solve(n - 3));
}
 
int main()
{
    dp[1= dp[2= 1;
    int t;
    cin >> t;
    for (; t--;) {
        int n;
        cin >> n;
        cout << solve(n) << '\n';
    }
    return 0;
}

cs




2. 점화식2


사실 그림을 잘 보면 규칙이 바로 나오는 문제이다. 그림을 잘 보면 큰 삼각형의 한 변에 닿아있는 두 삼각형 내부에 써져 있는 숫자의 합은 큰 삼각형 안에 있는 값과 동일한 것을 알 수 있다. 그림에서 9를 가지고 점화식을 세워보자. 


9가 나오는 방법은 그 전에 있던 삼각형과 5번째 전에 있던 삼각형의 합으로 나오는 것을 알 수 있다. 그러면 아래와 같이 세울 수 있다.



이것도 초기값을 잘 넣으면 쉽게 맞출 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
 
using namespace std;
typedef long long ll;
ll dp[1000= {0,1,1,1,2,2,};
 
ll solve(int n)
{
    if(dp[n])return dp[n];
    else return dp[n] = solve(n-1+ solve(n-5);
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t, n;
    cin >> t;
    while(t--){
        cin >> n;
        cout << solve(n) << '\n';
    }
    return 0;
}

cs




반응형

'알고리즘 > Baekjoon Online Judge' 카테고리의 다른 글

[백준 9657] 돌 게임 3  (0) 2019.01.25
[백준 1463] 1로 만들기  (0) 2019.01.23
[백준 15991] 1,2,3 더하기 6  (0) 2018.11.24
[백준 15990] 1,2,3 더하기 5  (0) 2018.11.22
[백준 15989] 1,2,3 더하기 4  (0) 2018.11.22
Comments