반응형
    
    
    
  이처럼 계속 증가하는 모양을 가지는 형태가 있다.
테스트 케이스 T가 주어졌을 때,
P(1) = 1
P(2) = 1
P(3) = 1
P(4) = 2
...
P(9) = 7
P(10) = 9 일때
P(n)을 구하시오. ( 1<= n <= 100 )
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44  | #include <stdio.h> long long int ans; int padovan(int n) {  if(n == 1) return 1;  else if(n == 2) return 1;  else if(n == 3) return 1;  else if(n == 4) return 2;  else if(n == 5) return 2;  else if(n == 6) return 3;  else if(n == 7) return 4;  else if(n == 8) return 5;  else if(n == 9) return 7;  else if(n == 10) return 9;  else  return padovan(n-1) + padovan(n-5);     } int main() {  int T,n;  scanf("%d",&T);  while(T > 0)  {   scanf("%d",&n);   ans = padovan(n);      printf("%lld\n",ans);   T--;  }  return 0;  }  | Crocus | 
결국 파도반 수열은 P(n) = P(n-1) + P(n-5)이다.
처음엔 다음과 같이 재귀 함수를 통한 값을 구하려고 하였지만,
n의 값을 77정도만 설정해도 시간이 2초정도 걸리고
88을 넣으면 계산을 못해내었다.
그래서 다르게 생각을 한 결과
prefix sum방식과 비슷하게 처음에 모든 값을 다 구해 놓는 방법을 쓰면 된다는 것을 알았다.
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 27 28 29 30 31 32 33 34 35 36 37  | #include <stdio.h> long long int result[100]={0,}; long long int N[101]={0,}; int main(){     int T,i;     scanf("%d",&T);     int insert;     N[0]=1;     N[1]=1;     N[2]=1;     N[3]=2;     N[4]=2;     N[5]=3;     N[6]=4;     N[7]=5;     N[8]=7;     N[9]=9;     for(i=10;i<101;i++)     {         N[i]=N[i-1]+N[i-5];     }     for(i=0; i<T; i++){         scanf("%d",&insert);         result[i]=N[insert-1];     }     for(i=0;i<T;i++){         printf("%lld\n",result[i]);     } }  | Crocus | 
재귀호출을 적재적소에 쓰면 좋은 코딩도 있지만, 괜히 재귀를 이용한 시간 복잡도의 증가와 메모리 낭비를 하지말자.
반응형
    
    
    
  'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
| 큰수 A+B (0) | 2016.01.25 | 
|---|---|
| 오름차순으로 수 정렬하기 (1) | 2015.12.15 | 
| Prefix Sum (수열의 구간 합 구하기) (1) | 2015.12.06 | 
| 특수 알고리즘 해결문서 (0) | 2015.12.06 | 
| 1~n까지의 합 (2) | 2015.12.01 |