본문 바로가기

Algorithm/Dynamic Programming

BaekJoon 1010 다리놓기

Link https://www.acmicpc.net/problem/1010

소스결과 1988 KB 16ms

출처 BackJoon 

언어 C++ 17

분류 다이나믹 프로그래밍

 

설명

만들 수 있는 다리의 총 합을 구하는 문제

DFS 처럼 생각해서 가지치기를 했더니 최대 다리 개수를 놓았을 경우에 너무 오래 걸렸다.

 

점화식은 간단하다

RES[i][j] = RES[i-1][j] + RES[i][j-1]

예외 조건은 순서가 역전 되지 않게 만들어 주기만 하면 된다.

 

어렵게 생각하면 밑도 끝도 없이 어렵다.. 간단하게 생각하자

 

알고리즘

1. DP Table을 초기화한다. 

2. 입력값 n, m 에 대하여 DP Table [ n -1 ] [ m - 1 ] 을 출력한다.

 

소스코드 

#include <iostream>

using namespace std;

const int MAX = 30;

int dp[MAX][MAX + 1];

int main()
{
	int n;

	cin >> n;

	//dp init
	for (int i = 0; i < MAX; i++)
	{
		for (int j = i; j < MAX; j++)
		{
			if (i == 0) // 첫번째 다리의 경우
				dp[i][j] = j + 1;
			else if (i == j) // 같은 번호의 다리의 경우
				dp[i][j] = 1;
			else // 그 외의 경우
				dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1];
		}
	}

	for (int i = 0; i < n; i++)
	{
		int left, right;
		cin >> left >> right;

		cout << dp[left-1][right-1] << '\n';
	}

	return 0;
}

 

'Algorithm > Dynamic Programming' 카테고리의 다른 글

BaekJoon 1003 피보나치 함수  (0) 2019.01.14
BaekJoon 2292 벌집  (0) 2019.01.13
BaekJoon 1699 제곱수의 합  (0) 2019.01.12
BaekJoon 11057 오르막수  (0) 2019.01.12
BaekJoon 1932 정수 삼각형  (0) 2019.01.12