https://www.acmicpc.net/problem/2193



문제의 조건을 보면서 눈에 띄는 것은 1이 두 번 연속으로 나타나지 않고 처음에 0으로 시작하지 않는 것이다. 

해당 문제를 보면서 90이라는 N의 범위를 보고 모든 경우를 구할 경우 최악의 경우 (2^90) 이기 때문에 다른 방법을 생각해야 한다.


여러가지 해결 방법이 있겠지만 n일 때 이전에 구한 값에서 그 값을 갖고오는 방법이다.
2차원 배열로 생각하였고 변수가 dp[2][n]일 경우에
dp[0][n] = n번째에서 그 값이 0인 경우,
dp[1][n] = n번째에서 그 값이 1인 경우로 나누었다.

그리고 각각 그 값이 0 일 경우에는 이전 n-1이 0과 1일 때 모두 가능하고 1일 경우에는 이전 n-1이 0일때만 가능하다.


그리고 가장 중요한 것은, 

항상 풀때마다 이 부분을 틀리는 데 n의 범위가 90 이면 int형으로 제대로 된 값을 구할 수 없어서 long 타입으로 제출해야 올바른 값이 나오게 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
using namespace std;
 
int main(){
    int n;
    cin>>n;
    
    vector<vector<long>> dp(n+1,vector<long> (2,0));
    
    dp[1][0]=0, dp[1][1]=1;
    for(int i=2;i<=n;i++){
        dp[i][0]=dp[i-1][0]+dp[i-1][1];
        dp[i][1]=dp[i-1][0];
    }
    
    cout<<dp[n][0]+dp[n][1]<<endl;
    return 0;
}
cs



'알고리즘(BOJ) > DP' 카테고리의 다른 글

백준 2156번 - 포도주 시식  (0) 2018.01.25
백준 11726번 - 2xN 타일링  (0) 2018.01.25
백준 9095번 - 1,2,3 더하기  (0) 2018.01.25
백준 1149번 - RGB거리  (0) 2018.01.25
백준 1463 - 1로 만들기  (2) 2018.01.24

+ Recent posts