실제 파도반 수열이 뭔지는 모르겠지만
원래 수열은 모르겠으면 쓰면 되는데 이것도 그림 보면서 수열을 적다보니 쉽게 규칙이 보였다!
수열이 1 1 1 2 2 3 4 5 7 9 12 16 21 28 37... 이런 식으로 증가하는데
각 수열의 항끼리 차를 통해 증가하는 값을 계산해보면
0 0 0 1 0 1 1 2 2 3 4 5 7 9... 이런 식으로 증가한다.
자세히보면 6번째부터 5개 전의 항만큼 더해지는 것을 알 수 있다.
즉., dp[i]=dp[i-1]+dp[i-5]라는 점화식을 쉽게 더해질 수 있다.
그리고 여기서 조심해야하는 점은 100번째 항이 int형 범위로는 표현할 수가 없어
long long int로 지정하여 문제를 풀 수 있었다.
항상 범위를 조심하고 떄에 맞는 자료형을 써야겠다.
여러 DP 문제들을 풀다보니 문제의 난이도를 좀 알 것같다.
1. 점화식도 쉽고 구현도 쉬운 문제
2. 점화식은 어려운데 구현은 쉬운 문제
3. 점화식을 쉬운데 구현은 어려운 문제
4. 점화식과 구현 모두 어려운 문제
개인적으로 느끼기에는 이 순서인데 이 문제는 1혹은 2에 해당하는 것 같다.
사실 아직 PS문제를 많이 안풀어봐서 구현하는 것을 잘 못해서 그러는 것 같긴한데
아직은 점화식이 어려운 문제가 조금 쉬운 듯한 느낌이 있다.
아래는 소스코드다!!
#include <stdio.h>
long long int dp[101];
int main(void)
{
int n;
scanf("%d",&n);
int arr[n+1];
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i+1]);
}
dp[1]=1,dp[2]=1,dp[3]=1,dp[4]=2,dp[5]=2;
for(int j=6;j<=100;j++)
{
dp[j]=dp[j-5]+dp[j-1];
}
for(int i=1;i<=n;i++)
{
printf("%lld\n",dp[arr[i]]);
}
}
'알고리즘! > Dynamic Programming' 카테고리의 다른 글
[C] 11726: 2Xn 타일링 (0) | 2023.07.25 |
---|---|
[C] 2156: 포도주 시식 (0) | 2023.07.24 |
[C] 1912: 연속합 (0) | 2023.07.23 |
[C] 1932: 정수 삼각형 (0) | 2023.07.23 |
[C] 12865: 평범한 배낭 (0) | 2023.07.22 |