πŸ‘Š PS/Algorithm

[Baekjoon] 9465번: μŠ€ν‹°μ»€

hades1 2024. 8. 11. 16:56

πŸ₯… 문제

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

 

πŸ” 섀계

μ²˜μŒμ— μ „ μ—΄μ—μ„œ μ–΄λ–€ 행을 μ‚¬μš©ν–ˆλŠ”μ§€μ— 따라 큐에 μΆ”κ°€ν•˜λŠ” 방식을 μ‚¬μš©ν•˜λ €κ³  μƒκ°ν•΄λ³΄μ•˜λŠ”λ°, 2^100000으둜 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•  κ²ƒμœΌλ‘œ μƒκ°λ˜μ–΄ μ œμ™Έν•˜μ˜€λ‹€.

 

μ‰½κ²Œ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆλ‹€. ν˜„μž¬ μ—΄μ—μ„œ 0행을 μ‚¬μš©ν•  것이라면, μ „ μ—΄μ—μ„œλŠ” 1ν–‰ λ˜λŠ” 아무것도 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ κ°’ 쀑 μ΅œλŒ“κ°’μ— 더해야 ν•œλ‹€. 아무 것도 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•ŒλŠ” 인덱슀 2에 μ €μž₯ν•˜μ˜€λ‹€. ν˜„μž¬ μ—΄μ—μ„œ 1행을 μ‚¬μš©ν•  것이라면, μ „ μ—΄μ—μ„œλŠ” 0ν–‰ λ˜λŠ” 아무것도 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ κ°’ 쀑 μ΅œλŒ“κ°’μ— 더해야 ν•œλ‹€  ν˜„μž¬ μ—΄μ—μ„œ 아무것도 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것이라면, μ „ μ—΄μ—μ„œ 0행을 μ‚¬μš©μ„ μ‚¬μš©ν–ˆμ„ λ•Œμ™€ 1행을 μ‚¬μš©ν–ˆμ„ λ•Œ 쀑 큰 값을 μ €μž₯ν•˜λ©΄ λœλ‹€.

 

πŸ‘Š 풀이

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int t, n;
vector<vector<int>> stickers(2, vector<int>(100000));
vector<vector<int>> dp(100000, vector<int>(3));

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> t;
	for (int k = 0; k < t; k++) {
		cin >> n;
		for (int i = 0; i < n; i++) {
			cin >> stickers[0][i];
		}
		for (int i = 0; i < n; i++) {
			cin >> stickers[1][i];
		}

		dp[0][0] = stickers[0][0];
		dp[0][1] = stickers[1][0];
		for (int i = 1; i < n; i++) {
			dp[i][0] = max(dp[i - 1][1], dp[i - 1][2]) + stickers[0][i];
			dp[i][1] = max(dp[i - 1][0], dp[i - 1][2]) + stickers[1][i];
			dp[i][2] = max(dp[i - 1][0], dp[i - 1][1]);
		}

		int result = 0;
		for (int i = 0; i < 3; i++) {
			result = max(result, dp[n - 1][i]);
		}
		cout << result << "\n";

	}
	
	return 0;
}