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

[λ°±μ€€] 13301번 - 타일 μž₯식물 (C++)

moaoh 2023. 8. 15. 22:15

 

 

13301번: 타일 μž₯식물

λŒ€κ΅¬ 달성곡원에 λ†€λŸ¬ 온 μ§€μˆ˜λŠ” μ΅œκ·Όμ— μƒˆλ‘œ λ§Œλ“  타일 μž₯식물을 보게 λ˜μ—ˆλ‹€. 타일 μž₯식물은 μ •μ‚¬κ°ν˜• 타일을 λΆ™μ—¬ λ§Œλ“  ν˜•νƒœμ˜€λŠ”λ°, ν•œ 변이 1인 μ •μ‚¬κ°ν˜• 타일뢀터 μ‹œμž‘ν•˜μ—¬ 마치 μ•΅λ¬΄μ‘°κ°œ

www.acmicpc.net

 

 

문제

λŒ€κ΅¬ 달성곡원에 λ†€λŸ¬ 온 μ§€μˆ˜λŠ” μ΅œκ·Όμ— μƒˆλ‘œ λ§Œλ“  타일 μž₯식물을 보게 λ˜μ—ˆλ‹€. 타일 μž₯식물은 μ •μ‚¬κ°ν˜• 타일을 λΆ™μ—¬ λ§Œλ“  ν˜•νƒœμ˜€λŠ”λ°, ν•œ 변이 1인 μ •μ‚¬κ°ν˜• 타일뢀터 μ‹œμž‘ν•˜μ—¬ 마치 μ•΅λ¬΄μ‘°κ°œμ˜ λ‚˜μ„  λͺ¨μ–‘μ²˜λŸΌ 점점 큰 타일을 뢙인 ν˜•νƒœμ˜€λ‹€. 타일 μž₯μ‹λ¬Όμ˜ 일뢀λ₯Ό 그리면 λ‹€μŒκ³Ό κ°™λ‹€.

κ·Έλ¦Όμ—μ„œ 타일에 적힌 μˆ˜λŠ” 각 νƒ€μΌμ˜ ν•œ λ³€μ˜ 길이λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 타일 μž₯식물을 κ΅¬μ„±ν•˜λŠ” μ •μ‚¬κ°ν˜• 타일 ν•œ λ³€μ˜ 길이λ₯Ό μ•ˆμͺ½ 타일뢀터 μ‹œμž‘ν•˜μ—¬ μ°¨λ‘€λ‘œ 적으면 λ‹€μŒκ³Ό κ°™λ‹€.

1, 1, 2, 3, 5, 8, ... 

μ§€μˆ˜λŠ” 문득 μ΄λŸ¬ν•œ νƒ€μΌλ“€λ‘œ κ΅¬μ„±λ˜λŠ” 큰 μ§μ‚¬κ°ν˜•μ˜ λ‘˜λ ˆκ°€ κΆκΈˆν•΄μ‘Œλ‹€. 예λ₯Ό λ“€μ–΄, 처음 λ‹€μ„―κ°œμ˜ 타일이 κ΅¬μ„±ν•˜λŠ” μ§μ‚¬κ°ν˜•(μœ„μ—μ„œ λΉ¨κ°„μƒ‰μœΌλ‘œ ν‘œμ‹œν•œ μ§μ‚¬κ°ν˜•)의 λ‘˜λ ˆλŠ” 26이닀.

νƒ€μΌμ˜ 개수 N(1 ≤ N ≤ 80)이 μ£Όμ–΄μ‘Œμ„ λ•Œ, N개의 νƒ€μΌλ‘œ κ΅¬μ„±λœ μ§μ‚¬κ°ν˜•μ˜ λ‘˜λ ˆλ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

 

 

μž…λ ₯

ν‘œμ€€ μž…λ ₯으둜 λ‹€μŒ 정보가 μ£Όμ–΄μ§„λ‹€. μž…λ ₯은 ν•œ μ€„λ‘œ κ΅¬μ„±λ˜λ©° 이 μ€„μ—λŠ” νƒ€μΌμ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N(1 ≤ N ≤ 80)이 μ£Όμ–΄μ§„λ‹€. 

 

 

 

좜λ ₯

ν‘œμ€€ 좜λ ₯으둜 N 개의 타일이 κ΅¬μ„±ν•˜λŠ” 타일 μž₯식물 μ§μ‚¬κ°ν˜•μ˜ λ‘˜λ ˆλ₯Ό 좜λ ₯ν•œλ‹€.

64λΉ„νŠΈ μ •μˆ˜ν˜•μΈ “long long” μžλ£Œν˜•μ„ 써야할 수 있음

 

 

μ„œλΈŒνƒœμŠ€ν¬

λ²ˆν˜Έλ°°μ μ œν•œ
1 21 N ≤ 7
2 53 N ≤ 40
3 26 μ›λž˜μ˜ μ œμ•½μ‘°κ±΄ 이외에 아무 μ œμ•½μ‘°κ±΄μ΄ μ—†λ‹€(이 경우 64λΉ„νŠΈ μ •μˆ˜ν˜•μΈ “long long” μžλ£Œν˜•μ„ 써야할 수 있음).

 

 

 

풀이과정

λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” 사항은 ν”Όλ³΄λ‚˜μΉ˜μ˜ 수λ₯Ό μ•΅λ¬΄μ‘°κ°œμ˜ λ‚˜μ„ λͺ¨μ–‘μ²˜λŸΌ λ§Œλ“€μ—ˆμ„λ•Œ λ‚˜μ˜€λŠ” n번째 μ‚¬κ°ν˜•μ˜ λ‘˜λž˜λ₯Ό κ΅¬ν•΄μ•Όν•˜λŠ” 문제 μ˜€μ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ ν”Όλ³΄λ‚˜μΉ˜μ˜ μˆ˜κ°€ "f[n] = f[n - 1] + f[n - 2]"인 μ ν™”μ‹μœΌλ‘œ 계산이 λ˜λ‹ˆ λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” μ‚¬κ°ν˜•μ˜ λ‘˜λž˜λ„ 일단 계산을 ν•΄λ³΄μžν•˜κ³  계산을 ν•΄λ³΄λ‹ˆ

n 크기 좜λ ₯κ°’
1 κ°€λ‘œ : 1 μ„Έλ‘œ : 1 4
2 κ°€λ‘œ : 1 μ„Έλ‘œ : 2 6
3 κ°€λ‘œ : 3 μ„Έλ‘œ : 2 10
4 κ°€λ‘œ : 3 μ„Έλ‘œ : 5 16

 

μœ„μ™€ 같은 κ²°κ³Όλ₯Ό 확인해 λ³Ό 수 μžˆμ—ˆκ³  nλ“€μ˜ 좜λ ₯값듀을 μ„œλ‘œ λΉ„κ΅ν•΄λ³΄λ‹ˆ ν”Όλ³΄λ‚˜μΉ˜μ˜ μˆ˜μ™€ 같이
"f[n] = f[n - 1] + f[n - 2]" ν˜•νƒœμ˜ 점화식이 λ‚˜μ˜€λŠ” 것을 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

code

#include <iostream>

long long f[81];

long long	dp(long long n) 
{
	if (n == 1) return (4);
	if (n == 2) return (6);
	if (n == 3) return (10);
	if (f[n] != 0) return (f[n]);
	return (f[n] = dp(n - 1) + dp(n - 2));
}

int		main(void)
{
	long long n;
	std::cin >> n;
	std::cout << dp(n);

	return (0);
}

 

ν›„κΈ°

ν”Όλ³΄λ‚˜μΉ˜μ˜ μˆ˜μ™€ 점화식이 κ°™λ‹€λŠ” 뢀뢄이 μ‹ κΈ°ν•˜κΈ°λ„ ν–ˆκ³ , 덕뢄에 μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆμ—ˆλ˜ κ±° κ°™μŠ΅λ‹ˆλ‹€.