BOJ 1126 ๊ฐ์ ํ
- solved ac class 7 essential
ํ์ด
Dynamic programming ์ ์ด์ฉํด์ ์ด๋ ต์ง ์๊ฒ ํด๊ฒฐํ ์ ์๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์.
DP[i][j]
: 1๋ฒ๋ถํฐ $i$๋ฒ๊น์ง์ ๋ธ๋ก๋ง ๊ณ ๋ คํ ๋, $H_A - H_B = j$ ๊ฐ ๋๋ฉด์ ๋ง๋ค ์ ์๋ $H_A$์ ์ต๋ ๋์ด
์ด๋ ๊ฒ ์ ์ํ๋ฉด, ํฌ๊ธฐ๊ฐ $h$์ธ ๋ค์ ๋ธ๋ก์ ์ถ๊ฐํ ๋, A์ ์น๋ ๊ฒฝ์ฐ์ B์ ์น๋ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ์๊ฐํ ์ ์๋ค. A์ ์น๋ ๊ฒฝ์ฐ์๋, ์ฐจ๊ฐ $j + h$ ๋ก ๋์ด๋๋ฉด์ $H_A$์ ํฌ๊ธฐ๋ ์ค์ ๋ก ๋์ด๋๊ณ , B์ ์น๋ ๊ฒฝ์ฐ์๋ ์ฐจ๊ฐ $j-h$๋ก ์ค์ด๋ค๋ฉด์ $H_A$์ ํฌ๊ธฐ๋ ๊ทธ๋๋ก ์ ์ง๋๋ค. ๊ฐ์ $j$์ผ ๋ $H_A$๊ฐ ํฌ๋ฉด ์๋ช ํ๊ฒ $H_B$๊ฐ ์ปค์ง๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๊ด๋ฆฌํด๋ ์ถฉ๋ถํจ์ ์ฝ๊ฒ ์ ์ ์๋ค.
๋ค๋ง $j$์ ๋ฒ์๊ฐ $-500,000$ ์์ $500,000$์ด๊ธฐ ๋๋ฌธ์, ์ค์ ๋ก๋ 100๋ง ์นธ์ DP๋ฅผ ์ก์์ $j$ ๋์ $j + 5e5$ ๋ก ์๊ฐํ๊ณ ์์ง์ด๋ฉด ๋๋ค. ์ด๋ ๊ฒ ๊ด๋ฆฌํ๋ฉด ๋ณต์ก๋ $2 * n * \sum H$ ์นธ์ DP ํ ์ด๋ธ์ ์ฑ์ฐ๋ ๊ฒ์ด๋ฏ๋ก ์๊ฐ ๋ด์ ์ ๊ด๋ฆฌ๊ฐ ๋๋ค.
5์ฒ๋ง ์นธ์ int๋ฅผ ์ก๊ณ ์ถ์ง ์๋ค๋ฉด, ๋ฐ๋ก ์ง์ DP ํ
์ด๋ธ๋ง ์์ผ๋ฉด ๋๋ค๋ ์ฌ์ค์ ์ด์ฉํด์ 100๋ง * 2๊ฐ๋ง ์์ผ๋ฉด ๋๋ค. ์๋ ์ฝ๋๋ ๊ทธ๋ ๊ฒ ๊ตฌํ๋์ด ์๋ค. ์ด๋ฅผ ๊ฐํน ํ ๊ธ๋ง์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ๊ตฌํ์์๋ ํ ๊ธ๋ง์ ํ์ง๋ ์์๊ณ ๊ทธ๋ฅ tmp์๋ค๊ฐ ๋งค๋ฒ memset
ํ๋ฉด์ ๊ฐ๋๋ฐ, 5์ฒ๋ง ์นธ memset์ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ฏ๋ก ๊ทธ๋ฅ ๋ฏฟ์ด๋ ์ถฉ๋ถํ๋ค.
๊ตฌํ์ ํธ์์, 0๊ฐ์ ๋ธ๋ก์ ์จ์ A = B = 0 ์ ๋ง๋ค ์ ์๋ค๊ณ ๋ณด๋ ๊ฒ์ด ์์ฐ์ค๋ฝ๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ค์ ๋ก ๋ถ๊ฐ๋ฅํ ์นธ๊ณผ ์ค์ ๋ก ๊ฐ๋ฅํ ์นธ์ ๊ตฌ๋ถ์ ํผ๋์ ์ฃผ๊ธฐ ๋๋ฌธ์, ๋๋ ๊ทธ๋ฅ ํธํ๊ฒ ๊ฐ์์ ๋์ด 1์ ์ค ๋ค์ ๋์ค์ ๋นผ ์ฃผ๋ ์์ผ๋ก ๊ตฌํํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค ์ง๊ณ ๋ณด๋ ๊ตณ์ด ๊ทธ๋ด ํ์๋ ์์๊ณ , ์ฒซ DP์์๋ง ์ ์ฒ๋ฆฌํด์ฃผ๋๊ฒ ๋ ๊ฐ๋จํ์๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค.
Code
#include <bits/stdc++.h>
#define usecppio ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
int M = 500000;
int dp[1010101];
int tmp[1010101];
int32_t main()
{
usecppio
int n; cin >> n;
dp[M] = 1;
for (int i = 0; i < n; i++)
{
int h; cin >> h;
memset(tmp, 0x0, sizeof(tmp));
for (int j = 0; j <= 2*M; j++)
{
if (j >= h)
{
if (dp[j] > 0)
tmp[j - h] = max(tmp[j - h], dp[j]);
}
if (j + h <= 2 * M)
{
if (dp[j] > 0)
tmp[j + h] = max(tmp[j + h], dp[j] + h);
}
}
for (int j = 0; j <= 2 * M; j++)
dp[j] = max(dp[j], tmp[j]);
}
if (dp[M] <= 1)
cout << -1 << '\n';
else cout << dp[M] - 1 << '\n';
}