728x90
문제
N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다.
i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있다.
- 에너지 구슬 하나를 고른다. 고른 에너지 구슬의 번호를 x라고 한다. 단, 첫 번째와 마지막 에너지 구슬은 고를 수 없다.
- x번째 에너지 구슬을 제거한다.
- Wx-1 × Wx+1의 에너지를 모을 수 있다.
- N을 1 감소시키고, 에너지 구슬을 1번부터 N번까지로 다시 번호를 매긴다. 번호는 첫 구슬이 1번, 다음 구슬이 2번, ... 과 같이 매겨야 한다.
N과 에너지 구슬의 무게가 주어졌을 때, 모을 수 있는 에너지 양의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 에너지 구슬의 개수 N(3 ≤ N ≤ 10)이 주어진다.
둘째 줄에는 에너지 구슬의 무게 W1, W2, ..., WN을 공백으로 구분해 주어진다. (1 ≤ Wi ≤ 1,000)
출력
첫째 줄에 모을 수 있는 에너지의 최댓값을 출력한다.
예제 입력 1
4
1 2 3 4
예제 출력 1
12
예제 입력 2
5
100 2 1 3 100
예제 출력 2
10400
예제 입력 3
7
2 2 7 6 90 5 9
예제 출력 3
1818
예제 입력 4
10
1 1 1 1 1 1 1 1 1 1
예제 출력 4
8
풀이
import sys
def backtrack(energy, beads):
global max_energy
if len(beads) == 2: # 구슬이 2개 남으면 종료 (양 끝만 남음)
max_energy = max(max_energy, energy)
return
for i in range(1, len(beads) - 1): # 첫 번째와 마지막 구슬 제외하고 선택
gain = beads[i - 1] * beads[i + 1] # 에너지 계산
new_beads = beads[:i] + beads[i + 1:] # i번째 구슬 제거
backtrack(energy + gain, new_beads) # 다음 단계 탐색
def solve():
global max_energy
n = int(sys.stdin.readline())
beads = list(map(int, sys.stdin.readline().split()))
max_energy = 0
backtrack(0, beads) # 초기 에너지는 0
print(max_energy)
solve()
728x90
'TIL > Baekjoon' 카테고리의 다른 글
[15650] N과 M(2) (0) | 2025.03.23 |
---|---|
[15649] N과 M(1) (0) | 2025.03.23 |
[9237] 이장님 초대 (0) | 2025.03.19 |
[11047] 동전 0 (0) | 2025.03.19 |
[14916] 거스름돈 (0) | 2025.03.19 |