티스토리 뷰

https://www.acmicpc.net/problem/9465

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의

www.acmicpc.net

 

dp[i][0] 는 i번쨰 열의 첫번쨰 행 스티커까지 뜯었을 때 얻을 수 있는 최대 점수
dp[i][1] 는 i번쨰 열의 두번쨰 행 스티커까지 뜯었을 때 얻을 수 있는 최대 점수
dp[i][2] 는 i번쨰 열의 스티커를 하나도 떼지 않았을 때 최대 점수

조건식
dp[i][0] = board[0][i] + max(dp[i-1][1], dp[i-1][2])
dp[i][1] = board[1][i] + max(dp[i-1][0], dp[i-1][2])
dp[i][0] = max(dp[i-1][0], dp[i-1][1], dp[i-1][2])
const input = require('fs')
	.readFileSync('./dev/stdin')
	.toString()
	.trim()
	.split('\n')
	.map((v) => v.split(' ').map(Number));

const [T] = input.shift();
const answer = [];
for (let t = 0; t < T; t++) {
	const [N] = input.shift();
	const board = [];
	board.push(input.shift());
	board.push(input.shift());
	let dp = [];
	dp[0] = [board[0][0], board[1][0], 0];
	let max = Math.max(...dp[0]);
	for (let i = 1; i < N; i++) {
		dp[i] = [];
		dp[i][0] = board[0][i] + Math.max(dp[i - 1][1], dp[i - 1][2]);
		dp[i][1] = board[1][i] + Math.max(dp[i - 1][0], dp[i - 1][2]);
		dp[i][2] = Math.max(dp[i - 1][0], dp[i - 1][1], dp[i - 1][2]);
		max = Math.max(max, ...dp[i]);
	}
	answer.push(max);
}

console.log(answer.join('\n'));
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함