Back to : algorithms
  • solved ac class 7 essential
Contents

ํ’€์ด

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';
}