백준 다리놓기 1010 C++

2021. 11. 26. 14:15알고리즘/백준

728x90

 

 

우선 먼저 했던 코드부터 올려보자면

 

#include <iostream>
#include <algorithm>
#include <vector>
#pragma warning(disable:4996)
using namespace std;


int main() {
	

	int t = 0;
	cin >> t;

	for (int i = 0; i < t; i++) {
		int a, b;
		cin >> a >> b;
		vector <int> b_b;
		a = min(a, b-a);
		unsigned long long int sum = 1;
		for (int q = 1; q <= a; q++) {
			b_b.push_back(q);
		}
		for (int u = a; u >= 1; u--) {
			sum = sum * b;
			for (int k = 0; k < a; k++) {
				if (sum% b_b[k] == 0 && b_b[k] != 1) {
					sum = sum / b_b[k];
					b_b[k] = 1;
				}
			}
			b--;
		}
		cout << sum << '\n';
	}

	return 0;
}

예제는 다 돌아가지만, 결국 타임 에러가 뜨는 문제이다. 

 

이 문제를 풀기 위해서는 다른 다양한 방법이 있지만 

나는 DP와 파스칼 삼각형을 이용한  방법을 사용해서 풀어봤다.

 

 

 

 

#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#pragma warning(disable:4996)
using namespace std;

int func(int, int);

int main() {
	
	
	int t = 0;
	cin >> t;
	memset(arr, -1, sizeof(arr));
	for (int i = 0; i < t; i++) {
		
		int a, b;
		int sum = 0;
		cin >> a >> b;
		sum = func(b,a);

		cout << sum << '\n';
	}

	return 0;
}
int func(int n, int m) {
	m = min(m, n - m);
	if (n == m) return 1;
	if (m == 0)return 1;
	if (m == 1) return n;
	if (arr[n][m] != -1) return arr[n][m];
	arr[n][m] = func(n - 1, m) + func(n - 1, m - 1);
	return arr[n][m];
}

func의 함수 내용은 조합의 성질을 나타냈다. 

n과 m의 계수가 같으면 1을 반환

m이 0이 될일이 없지만, 0이 된다면 1을 반환

m이 1이면 1을 n을 반환 그리고 그 값들을 배열에 넣어서 다음에도 사용할 기회가 있다면, 사용하도록 

배열에 그 값을 넣어줍니다.(배열은 초기에 한 번만 초기화시키면 됨)

 

이렇게 dp를 통해서 문제를 한번 풀어봤습니다.

 

 

 

 

 

 

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

백준 24479 C++  (0) 2022.05.28
백준 22351 수학은 체육과목 입니다. 3  (0) 2022.05.23
백준 4150 피보나치 수(c++)  (0) 2022.04.02
(C++) 백준 1111번 IQ Test  (0) 2021.12.01
백준 1018 c++ 완전탐색(Brute-force Serch)  (0) 2021.11.03