ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1788 피보나치 수의 확장
    백준/DP 다이나믹 프로그래밍 2024. 7. 9. 22:50

     

     

    양수, 음수를 나누어서 풀었는데,

     

    일단 

     

    f(0) = 0

    f(1) = 1 

     

    1) n : 양수

    f(n) = f(n-1) + f(n-2) 이므로,

     

    f(2) = f(1) + f(0) 

    f(3) = f(2) + f(1) 

    f(4) = f(3) + f(2)

     

    여기에서, dp[i] = dp[i-1] + dp[i-2] 임을 알 수 있다.

     

     

    2) n : 음수

     

    f(n-2) = f(n) - f(n-1) 이므로

    f(-1) = f(1) - f(0)

    f(-2) = f(0) - f(-1)

    f(-3) = f(-1) - f(-2)

     

    이 경우, 절댓값으로 숫자 따지면,

    dp[i] = dp[i-2] - dp[i-1] 이 된다.

     

    그래서 양수의 경우는 dp_plus 배열로, 음수의 경우는 dp_minus 배열로 따로 만들었고,

    음수의 경우에는 

    -1 일 경우, f(1) 을 더해야 하므로, 양수와 관련되어 

    dp_minus[1] = dp_plus[1] - dp_plus[0] = 1 값을 처음에 넣어주고,

    dp_minus[2] 부터 계산하도록 하였다.

     

    -------------------------------------

     

    하지만 꼭 이렇게 풀지 않아도 되고,

    따져보면

    양수의 경우 

    n 0 1 2 3 4 5
    0 1 1 2 3 5

     

     

    음수의 경우

     

    n 0 1 2 3 4 5
    0 1 -1 2 -3 5

     

    이런식으로, 절댓값은 같고, 마이너스 부호가 붙는 경우의 차이만 생긴다는 것을 알 수 있다. 

     

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
     
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int N = Integer.parseInt(st.nextToken());
        
            int dp_plus[] =  new int[1000001];
            int dp_minus[] = new int[1000001];
            
            dp_plus[0] = 0;
            dp_plus[1] = 1;
            
            dp_minus[0] = 0; 
            dp_minus[1] = 1; 
           
            
            for(int i =2; i<=1000000; i++) {
            
            	dp_plus[i] = (dp_plus[i-1] + dp_plus[i-2])%1000000000;
            	dp_minus[i] = (dp_minus[i-2] - dp_minus[i-1])%1000000000;
            }              
       
            
            int result = 0;
            if(N>=0) {
            	result = dp_plus[N];
            }else {
            	result= dp_minus[Math.abs(N)];
            }
            
            if(result>0) {
            	System.out.println(1);
            	System.out.println(result);
            }else if(result ==0 ) {
            	System.out.println(0);
            	System.out.println(result);
            }else if(result<0) {
            	System.out.println(-1);
            	System.out.println(Math.abs(result));
            }
          
            
        }
    }

    '백준 > DP 다이나믹 프로그래밍' 카테고리의 다른 글

    2156 포도주 시식  (0) 2024.08.09
    10844 쉬운 계단 수  (0) 2024.08.07
    1915 가장 큰 정사각형  (0) 2024.06.26
    10164 격자상의 경로  (0) 2022.05.22
    11060 점프 점프  (0) 2022.05.22

    댓글

Designed by Tistory.