https://www.acmicpc.net/problem/11727
2*n크기의 직사각형을 채울 때
n-1번째에서 가로의 길이가 1 직사각형을 더해주고
n-2번째에서 가로의 길이가 2인 직사각형을 더해주면 된다.
처음에 문제에 해당하는 답이 안나와서 왜 안나올까 고민을 하다가
가로의 길이가 2인 직사각형을 더해줄 때 1가지가 아닌 2가지 경우를 반영해서 해결할 수 있었다.
즉 가로의 길이가 2인 직사각형에서
세로의 길이가 1인 직사각형과 세로의 길이가 2인 직사각형을 같이 생각해야 한다.
점화식은 다음과 같다
dp[n] = dp[n-1] + dp[n-2]*2
(dp[n]은 길이가 n일 때 직사각형을 채울 수 있는 방법의 수)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> using namespace std; int main(){ int n; cin>>n; int dp[1001]={0,1,3}; for(int i=3;i<=n;i++){ dp[i]=dp[i-1]+dp[i-2]*2; dp[i]%=10007; } cout<<dp[n]<<endl; return 0; } | cs |
'알고리즘(BOJ) > DP' 카테고리의 다른 글
백준 9465번 - 스티커 (0) | 2018.01.28 |
---|---|
백준 2167번 - 2차원 배열의 합 (0) | 2018.01.25 |
백준 2293번 - 동전 1 (0) | 2018.01.25 |
백준 11052번 - 붕어빵 판매하기 (2) | 2018.01.25 |
백준 11053번 - 가장 긴 증가하는 부분 수열 (0) | 2018.01.25 |