Algorithm/λ¬Έμ œν’€μ΄

[λ°±μ€€] 11051번 - 이항 κ³„μˆ˜ 2 (C++)

moaoh 2023. 8. 17. 23:53

 

11051번: 이항 κ³„μˆ˜ 2

첫째 쀄에 \(N\)κ³Ό \(K\)κ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ \(N\) ≤ 1,000, 0 ≤ \(K\) ≤ \(N\))

www.acmicpc.net

 

문제

 

 

 

μž…λ ₯

 

 

좜λ ₯

 

 

풀이과정

μ΄ν•­κ³„μˆ˜λΌλŠ” 문제의 κΈ°λ³Έ 원칙은 μœ„μ™€ 같은 ν˜•μ‹μœΌλ‘œ 접근을 ν•  수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€.

μœ„μ™€ 같은 점화식이 n, k 값이 λ“€μ–΄μ˜€λ©΄ μ›ν•˜λŠ” 값을 λ„μΆœν•΄λ‚Ό 수 μžˆλŠ” 점화식이라고 ν•΄μ„œ

μœ„μ™€ 같은 풀이식을 λ¬Έμ œμ— λŒ€μž…ν•΄μ„œ ν’€μ–΄λ³΄μ•˜λ”λ‹ˆ 이미 계산이 된 값에 % 10007을 μ§„ν–‰ν•˜λŠ” μ‹μœΌλ‘œ μ½”λ“œ μ§„ν–‰μ΄λ˜μ–΄ λŸ°νƒ€μž„μ—λŸ¬κ°€ λ°œμƒμ΄ λ˜μ—ˆμ—ˆλ‹€.

 


κ·Έλž˜μ„œ 고민을 ν•˜λ‹€κ°€ 이항 κ³„μˆ˜λΌλŠ” 수 μžμ²΄κ°€ κ΅¬ν•˜λ €λŠ” 수의 μœ„μ—μžˆλŠ” 2개의 수λ₯Ό λ”ν•˜λ©΄ ꡬ할 수 μžˆλŠ” κ°’μ΄λ‹€λ³΄λ‹ˆ

// 1
// 1 1
// 1 2 1
// 1 3 3 1

// dp[n][k] = dp[n - 1][k - 1] + dp[n - 1][k]

κ·ΈλŒ€λ‘œ 배열을 λ§Œλ“€μ–΄μ„œ κ΅¬ν•˜λ €λŠ” κ°’ μœ„μͺ½μ— μžˆλŠ” 2개의 값을 λ”ν•˜λŠ” ν˜•μ‹μœΌλ‘œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

code

#include <iostream>

long long	f[1001][1001];


// dp[n][k] = dp[n - 1][k - 1] + dp[n - 1][k]
// 1
// 1 1
// 1 2 1
int		main(void)
{
	long long n, k;
	std::cin >> n >> k;

	f[0][0] = 1;
	f[1][0] = 1;
	f[1][1] = 1;
	for (int i = 2; i <= n; i++) {
		for (int j = 0; j <= i; j++) {
			if (j == 0 || j == i) f[i][j] = 1;
			f[i][j] = (f[i - 1][j - 1] + f[i - 1][j]) % 10007;
		}
	}
	std::cout << f[n][k];

	return (0);
}

 

ν›„κΈ°

μ²˜μŒμ—λŠ” 문제λ₯Ό μž¬κ·€λ‘œ 접근을 ν–ˆμ—ˆλŠ”λ°
μž¬κ·€λ‘œ 접근을 μž¬κ·€μ΄λ‹€λ³΄λ‹ˆ 같은 값을 또 κ΅¬ν•˜λŠ” 상황이 λ°œμƒμ΄ λ˜μ–΄ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒμ΄ λ˜μ—ˆλ‹€.

dp문제λ₯Ό μ ‘κ·Όν• λ•ŒλŠ” dpμžμ²΄κ°€ μ›ν•˜λŠ” 값을 효율적으둜 λ„μΆœν•΄λ‚΄λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€λ³΄λ‹ˆκΉŒ

μž¬κ·€λŠ” dp와 λ§žμ§€μ•ŠλŠ”λ‹€λΌλŠ” 생각을 κ°€μ§€κ²Œ λ˜μ—ˆλ‹€.