https://www.acmicpc.net/problem/1309
동물원 좋아요
정말좋아요
문제 이해는 어렵지 않을거라 본다
우리는 정말 수많은 DP문제들을 풀어보았다.. 그렇지않은가?
그럼 감이 올 것이다.
저 2칸에 대해서 나올 수 있는 경우의 수는 3가지
왼쪽에만 없거나
오른쪽에만 없거나
둘다 없거나..
그래서 ..
dp[i]번째에 대해서 dp[i-1]번째에 대한 것들을 더할때,
dp[i][왼쪽] = dp[i-1]][오른쪽[+dp[i-1][둘다없을때]
를 하면된다...
#include <iostream>
#include <cmath>
using namespace std;
long dp[100001][3];
long MOD = 9901;
int main()
{
int n;
cin >> n;
dp[1][0] = 1; // 왼쪽
dp[1][1] = 1; // 오른쪽
dp[1][2] = 1; // 아무것도 ㄴㄴ
for (int i = 2; i < 100001; i++)
{
dp[i][0] = dp[i - 1][0] + dp[i - 1][2];
dp[i][1] = dp[i - 1][1] + dp[i - 1][2];
dp[i][2] = dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][0];
dp[i][0] %= MOD;
dp[i][1] %= MOD;
dp[i][2] %= MOD;
}
long sum;
sum = dp[n][0] + dp[n][1] + dp[n][2];
sum %= MOD;
cout << sum << "\n";
}
흐으
'코딩 테스트 준비! (백준) > DP' 카테고리의 다른 글
[DP] 백준 11053번 가장 긴 증가하는 부분수열(C++) (0) | 2025.04.10 |
---|---|
[동적프로그래밍] 백준 1699번 제곱수의 합(C++) (0) | 2025.04.03 |
[동적프로그래밍] 백준 1463번 1로 만들기(C++) (0) | 2025.04.03 |
[동적프로그래밍] 백준 2225번 합분해(C++) (0) | 2025.04.01 |
[동적프로그래밍] 백준 17404번 rgb 거리 2(C++) (0) | 2025.03.31 |