Skip to content

wonseokdjango/AOJ

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

41 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

AOJ

AOJ solutions

this repo has solutions of some problems at AOJ(algospot.com)

contact : won.seok.django@gmail.com


##์ „๋žต

  1. ๋น„์Šทํ•œ ๋ฌธ์ œ ๋– ์˜ฌ๋ฆฌ๊ธฐ.
  2. brute force.
  3. ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ.
  4. ๋’ค์—์„œ๋ถ€ํ„ฐ ํ’€์–ด๋ณด๊ธฐ.
  5. ๋ถ„ํ•ดํ•˜๊ธฐ/๊ทธ๋ฃน์ง“๊ธฐ.
  6. ์†์œผ๋กœ ํ’€์–ด๋ณด๊ธฐ.
  7. ๊ทธ๋ฆผ ๊ทธ๋ ค๋ณด๊ธฐ.
  8. ์ˆ˜์‹์œผ๋กœ ํ’€์–ด๋ณด๊ธฐ.

###๋ฌธ์ œID : FESTIVAL(AOJ_FESTIVAL.cpp)

2016.12.28.(์ˆ˜)

๋งค์šฐ ์‰ฌ์šด ๋ฌธ์ œ์— ์†ํ•œ๋‹ค. ์ „์ฒด N์ผ ์ค‘ L๊ฐœ ์ด์ƒ ์—ฐ์†ํ•œ ๊ตฌ๊ฐ„์„ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•˜์—ฌ ์ตœ์†Œ์˜ ํ‰๊ท  ๋Œ€์—ฌ์ผ์„ ๊ฐ–๋Š” ๊ตฌ๊ฐ„์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. N์˜ ๋ฒ”์œ„๊ฐ€ 1000๊ฐœ ๋ฐ–์— ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์•„๋ฌด๋ฆฌ ๋งŽ์•„ 1000H2๊ฐœ ๋ฟ์ด๊ณ  ์ด๋Š” ์ถฉ๋ถ„ํžˆ 1์ดˆ์•ˆ์— ํ’€ ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ์˜ ํฌ๊ธฐ์ด๋‹ค. ๊ตฌ๊ฐ„์˜ ํ‰๊ท ์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๋™ ํ‰๊ท  ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‹ค ๋‚˜์€ ํšจ์œจ์„ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.


double solve(void)
{
    int sum = 0;
    double avg = MAXAVG;

    for (int s = 0; s <= N - L; ++s)
    {   
        // initial min avg from s to s + L - 1.
        sum = 0;
        for (int l = 0; l < L; ++l)
        {
            sum += COST[s + l]; 
        }
        avg = std::min(avg, (double)sum / L); 

        // min avg from s to e.
        for (int e = s + L; e < N; ++e)
        {
            sum += COST[e];
            avg = std::min(avg, (double)sum / (e - s + 1));
        }
    }   

    return avg;
}


###๋ฌธ์ œID : PICNIC(AOJ_PICNIC.cpp)

2016.12.30.(๊ธˆ)

์ž…๋ ฅ์˜ ํฌ๊ธฐ๊ฐ€ 10์œผ๋กœ ๋งค์šฐ ์ž‘์€ ํŽธ์ด์–ด์„œ brute force ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์„ธ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ(๋ชจ๋‘๊ฐ€ ์นœ๊ตฌ์ธ ๊ฒฝ์šฐ)์—๋„ 10C2 * 8C2 * 6C2 * 4C2 * 2C2 / 5! - 945๊ฐœ์˜ ์กฐํ•ฉ๋งŒ์ด ์กด์žฌํ•˜๋ฏ€๋กœ ์ถฉ๋ถ„ํžˆ ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๋‚ด์— ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ๋ชจ๋“  ์กฐํ•ฉ์„ ํƒ์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์ด ์ฒ˜์Œ์—๋Š” ์กฐ๊ธˆ ์–ด์ƒ‰ํ•˜๊ฒŒ ๋А๊ปด์กŒ์—ˆ๋Š”๋ฐ ๊ตฌํ˜„ ํ•ด๋†“๊ณ  ๋ณด๋‹ˆ ์ž˜ ๋™์ž‘ํ•˜์˜€๊ณ  ์ฑ…์˜ ๊ตฌํ˜„๊ณผ๋„ ๊ฑฐ์˜ ์ผ์น˜ํ•˜์˜€๋‹ค. ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ํ•จ์ˆ˜ solve๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.


/**
  * ๋ชจ๋“  ํ•™์ƒ์ด ์ง์„ ๊ฐ€์ง€๊ฒŒ ๋œ ๊ฒฝ์šฐ 1์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  * ์ง์„ ๊ฐ€์ง€์ง€ ์•Š์€ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ๊ฐ€์žฅ ์•ž์„  ํ•™์ƒ์„ ์ฐพ๊ณ , ์—ญ์‹œ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ง์„ ๋ฐฐ์ •ํ•œ๋‹ค.
  * ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์˜ ์ˆ˜๋ฅผ ์„ผ๋‹ค.
  */
int solve(void)
{
    int idx;
    for (idx = 0; idx < N && IS_PAIRED[idx]; ++idx);

    if (idx == N)                                   ///< ๋ชจ๋“  ํ•™์ƒ์ด ์ง์„ ์ฐพ์€ ๊ฒฝ์šฐ 1์„ ๋ฐ˜ํ™˜.
        return 1;

    int ret = 0;                                    ///< ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์ธ ๊ฒฝ์šฐ์—๋Š” 0์„ ๋ฐ˜ํ™˜.
    for (int l = 0; l < N; ++l)
    {   
        if (!IS_PAIRED[l] && IS_FRIEND[idx][l])
        {   
            IS_PAIRED[idx] = IS_PAIRED[l] = true;   ///< ์„ ํƒ์„ ๋ฐ˜์˜.
            ret += solve();                         ///< ์กฐํ•ฉ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ผ๋‹ค.
            IS_PAIRED[idx] = IS_PAIRED[l] = false;  ///< ์„ ํƒ ๋ฐ˜์˜์„ ์ทจ์†Œ.
        }   
    }   

    return ret;
}


###๋ฌธ์ œID : BOARDCOVER(AOJ_BOARDCOVER.cpp)

2017.01.04.(์ˆ˜)

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฐฉํ–ฅ์„ ์ž˜๋ชป ์žก์•„์„œ ๊ณ ์ƒ์„ ํ–ˆ๋‹ค. ๋งจ ์ฒ˜์Œ์˜ ์ ‘๊ทผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  1. ๋งค ์žฌ๊ท€ ํ˜ธ์ถœ๋งˆ๋‹ค ๋ณด๋“œ์—์„œ row-major๋กœ ๊ฐ€์žฅ ์ฒ˜์Œ์˜ ๋นˆ ์นธ์„ ์ฐพ๋Š”๋‹ค.

  2. ๋นˆ ์นธ์ด ์—†๋‹ค๋ฉด ๋ณด๋“œ ๋ฎ๊ธฐ์— ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

  3. ๋นˆ ์นธ์— ๋Œ€ํ•˜์—ฌ ๋‹ค์Œ์˜ 5๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•˜์—ฌ ์ „-ํƒ์ƒ‰ ํ•ด๋ณธ๋‹ค.

    a. ํ•ด๋‹น ์นธ์„ ํ™•์ธํ•˜์˜€์Œ๋งŒ ํ‘œ์‹œํ•˜๊ณ  ์•„๋ฌด ๋ธ”๋ก๋„ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค(๋‹ค์Œ ๋ฒˆ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ์—์„œ ์ฑ„์›Œ์ง€๋„๋ก ๋นˆ์นธ์œผ๋กœ ์œ ์ง€). b. ํ•ด๋‹น ์นธ์— ์•„๋ž˜์˜ 4๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ๋ธ”๋ก์œผ๋กœ ๋ฐฐ์น˜ํ•ด๋ณธ๋‹ค.

    boardcover1

์ด ๋ฐฉ๋ฒ•์€ ๊ฐ ๋นˆ ์นธ์— ๋Œ€ํ•˜์—ฌ 5๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜๊ณ  ์ด๋Š” roughํ•˜๊ฒŒ 5^50๊ฐœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์„ธ๊ฒŒ ๋œ๋‹ค. ์ด๋Š” 2์ดˆ ์ œํ•œ์— ํ’€๊ธฐ์—๋Š” ํฐ ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋ฏ€๋กœ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ TLE๋ฅผ ๊ฒช๊ฒŒ ๋œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์‹œ๋„ํ•œ ๋ฐฉ๋ฒ•์€ ์ฒ˜์Œ ์ ‘๊ทผํ•œ ๋ฐฉ๋ฒ•์ธ brute force๋ฅผ ์œ ์ง€ํ•˜๋˜ ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ™” ์‹œํ‚จ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋งค ์žฌ๊ท€ ํ˜ธ์ถœ๋งˆ๋‹ค row-major๋กœ ๊ฐ€์žฅ ์ฒ˜์Œ์˜ ๋นˆ ์นธ์„ ์ฐพ์œผ๋ฏ€๋กœ row-major๋กœ ํ•ด๋‹น ๋นˆ ์นธ ์ด์ „์— ์œ„์น˜ํ•˜๋Š” ๋นˆ ์นธ๋“ค์€ ์ด๋ฏธ ๋ชจ๋‘ ์ฑ„์›Œ์ง„ ํ˜•ํƒœ๋กœ ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ฐฉ๋ฒ•์˜ ํ•ต์‹ฌ์ด๋‹ค.

  1. ๋งค ์žฌ๊ท€ ํ˜ธ์ถœ๋งˆ๋‹ค ๋ณด๋“œ์—์„œ row-major๋กœ ๊ฐ€์žฅ ์ฒ˜์Œ์˜ ๋นˆ ์นธ์„ ์ฐพ๋Š”๋‹ค.

  2. ๋นˆ ์นธ์ด ์—†๋‹ค๋ฉด ๋ณด๋“œ ๋ฎ๊ธฐ์— ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

  3. ๋นˆ ์นธ์— ๋Œ€ํ•˜์—ฌ ์•„๋ž˜์˜ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.

    boardcover1

์‹ค์ œ๋กœ row-major๋กœ ํ•ด๋‹น ๋นˆ์นธ ์ด์ „์˜ ๋ธ”๋ก์ด ๋ชจ๋‘ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด ๊ณ ๋ ค์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋ธ”๋ก์€ 2, 5, 9, 12๋ฒˆ์งธ ๋ธ”๋ก ๋ฟ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์œ„์˜ 4๊ฐœ ๋ธ”๋ก์— ๋Œ€ํ•˜์—ฌ ์ „-ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ 4^(floor(50/3))์ด ๋˜๊ฒŒ ๋œ๋‹ค. ์ด ์—ญ์‹œ 2์ดˆ ์ œํ•œ์— ํ’€๋ฆฌ๊ธฐ๋Š” ์–ด๋ ค์šด ์ •๋„์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜์ธ๋ฐ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ฒŒ ๋˜๋ฉด n-th ์žฌ๊ท€๋‹จ๊ณ„์—์„œ ๋†“์€ ๋ธ”๋ก์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ n+1-th ์žฌ๊ท€๋‹จ๊ณ„์—์„œ ๋†“๊ฒŒ ๋˜๋Š” ๋ธ”๋ก์ด ํฌ๊ฒŒ ์ œํ•œ๋˜๋ฏ€๋กœ prunning์ด ์ปค์ง€๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2*3 ํฌ๊ธฐ์˜ ๋ณด๋“œ๋ฅผ ๋ฎ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด๋ก ์ ์œผ๋กœ 4^2๊ฐœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” 12๊ฐœ ๋ฐ–์— ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ณ  ์ด๋ก ๊ณผ ๊ตฌํ˜„์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์‚ฌ์ „์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ๋ฐ, ๊ณผ์—ฐ ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ด๋Ÿฐ ๋ถ€๋ถ„๋“ค์„ ์ž˜ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ž์‹ ์ด ์—†๋‹ค.


int solve(void)
{
    int r, c;
    for (r = 0; r < H; ++r)
    {
        for (c = 0; c < W; ++c)
        {
            if (BOARD[r][c] == '.')
                break;
        }

        if (c != W)
            break;
    }

    if (r == H && c == W)
        return 1;

    int ret = 0;
    for (int blk = 0; blk < NUMOFBLOCKS; ++blk)
    {
        int idx;
        for (idx = 0; idx < NUMOFBLANKS; ++idx)
        {
            if (
                !safe(r + dr[blk][idx], c + dc[blk][idx]) ||
                BOARD[r + dr[blk][idx]][c + dc[blk][idx]] != '.')
                break;
        }
        // you can put blk-th block.
        if (idx == NUMOFBLANKS)
        {
            for (idx = 0; idx < NUMOFBLANKS; ++idx)
                BOARD[r + dr[blk][idx]][c + dc[blk][idx]] = '#';
            ret += solve();
            for (idx = 0; idx < NUMOFBLANKS; ++idx)
                BOARD[r + dr[blk][idx]][c + dc[blk][idx]] = '.';
        }
    }

    return ret;
}


###๋ฌธ์ œID : CLOCKSYNC(AOJ_CLOCKSYNC.cpp)

2017.01.06.(๊ธˆ).

์ง์ ‘ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ „-ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ „ํƒ์ƒ‰์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์‚ฌ์‹ค์„ ๊นจ๋‹ซ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

1. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ์ˆœ์„œ๋Š” ๋‹ต์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•œ๋‹ค.
2. ๋ฒ„ํŠผ์„ 4ํšŒ ์ด์ƒ ๋ˆ„๋ฅด๋Š” ๊ฒƒ์€ ๋งˆ๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

๋”ฐ๋ผ์„œ, ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ์ˆœ์„œ๋ฅผ 0๋ฒˆ9๋ฒˆ์œผ๋กœ ๊ฐ•์ œํ™”ํ•˜๊ณ , ๊ฐ ๋ฒ„ํŠผ์˜ ํด๋ฆญ์„ 0ํšŒ3ํšŒ๋กœํ•˜์—ฌ ์ „-ํƒ์ƒ‰์„ํ•˜๊ฒŒ ๋˜๋ฉด ์ด 4^10๊ฐœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฐ˜์„ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์ œํ•œ์‹œ๊ฐ„ ๋‚ด์— ์ถฉ๋ถ„ํžˆ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํ•œํŽธ, ์žฌ๊ท€ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ (์ด๋ฒˆ์— ๊ณ ๋ คํ•  ๋ฒ„ํŠผ์˜ ๋ฒˆํ˜ธ, ํ˜„์žฌ๊นŒ์ง€ ๋ฒ„ํŠผ์˜ ํด๋ฆญ ํšŸ์ˆ˜) ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋Š” ๋‹ต์˜ ํ›„๋ณด๋Š” ์ ์ ˆํžˆ prunningํ•œ๋‹ค.


void solve(int btn, int cnt)
{
    int clk;
    for (clk = 0; clk < NUMOFCLOCKS && CLOCKS[clk] == 0; ++clk);
    if (clk == NUMOFCLOCKS)
    {
        CNT = (CNT > cnt) ? cnt : CNT;
        return;
    }

    if (btn == NUMOFBUTTONS)
        return;

    // click btn-th button.
    int idx;
    for (int click = 0; click < 4 && cnt + click < CNT; ++click)
    {
        idx = 0;
        while (TRIGGER[btn][idx] != -1)
        {
            CLOCKS[TRIGGER[btn][idx]] = (CLOCKS[TRIGGER[btn][idx]] + 3 * click) % 12;
            ++idx;
        }

        solve(btn + 1, cnt + click);

        idx = 0;
        while (TRIGGER[btn][idx] != -1)
        {
            CLOCKS[TRIGGER[btn][idx]] = (CLOCKS[TRIGGER[btn][idx]] + 9 * click) % 12;
            ++idx;
        }
    }
}


###๋ฌธ์ œID : QUADTREE(AOJ_QUADTREE.cpp)

2016.01.06.(๊ธˆ).

์ง์ ‘ ์†์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๊ฒŒ ๋˜๋ฉด ์ž์—ฐ์Šค๋ ˆ TREE๋ฅผ ๊ทธ๋ฆฌ๊ฒŒ ๋œ๋‹ค(์–ด์ฉŒ๋ฉด ๋ฌธ์ œ ์ด๋ฆ„ ์ž์ฒด๊ฐ€ TREE์ด๋‹ˆ ๋‹น์—ฐํ•œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค). ๋ช‡ ๋ฒˆ ํ’€์–ด๋ณด๋ฉด TREE์˜ leaf node๋ถ€ํ„ฐ ์ƒํ•˜๋ฅผ ๋ฐ˜์ „์‹œ์ผœ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ  ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์€ ๊ฐ•ํ•œ ๋А๋‚Œ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ์‹ค์ œ๋กœ TREE๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žฌ๊ท€์ ์œผ๋กœ ์ƒํ•˜๋ฅผ ๋ฐ˜์ „์‹œํ‚ฌ์ง€ ๊ทธ๋ƒฅ ๋ฌธ์ž์—ด์„ ์ฝ์œผ๋ฉด์„œ ์ฒ˜๋ฆฌํ• ์ง€ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ ์•„๋ฌด๋ž˜๋„ ๋‘ ๋ฒˆ์งธ ํ’€๋‹ค๋ณด๋‹ˆ TREE๋ฅผ ์ง์ ‘ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ถฉ๋ถ„ํžˆ ํ’€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋– ์˜ฌ๋ž๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ์œผ๋‹ˆ ์žฌ๊ท€ํ•จ์ˆ˜์˜ return ๊ฐ’๊ณผ parameter๋ฅผ ๋ฌด์—‡์œผ๋กœ ํ•  ์ง€, base case๋Š” ๋ฌด์—‡์ธ์ง€, recursive step์€ ๋ฌด์—ˆ์ธ์ง€ ๊ฒฐ์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๊ฐ๊ฐ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒฐ์ •ํ•˜์˜€๋‹ค.

  1. ๋ฐ˜ํ™˜ ๊ฐ’

๊ฒฐ๊ตญ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ƒํ•˜๊ฐ€ ๋ฐ˜์ „๋œ QUADTREE ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ์ด ๋ฌธ์ž์—ด์„ ์žฌ๊ท€ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•˜๋‚˜์˜ ์ „์—ญ ๋ฌธ์ž์—ด ๋ฒ„ํผ์— ์“ฐ๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ์ „์—ญ ๋ฒ„ํผ์— ์“ฐ์ธ ๋ฌธ์ž์—ด์˜ ์ˆœ์„œ๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•ด์ฃผ์–ด์•ผํ•˜๋Š” ๋“ฑ ๊ท€์ฐฎ์•„์ง„๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์žฌ๊ท€ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ํ•ด์ฃผ๋ฉด ๋ณด๋‹ค ์‰ฌ์šด ์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ, ์žฌ๊ท€ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์œ„์น˜๋กœ๋ถ€ํ„ฐ sub-tree๋ฅผ ์ƒํ•˜๋ฐ˜์ „ ์‹œํ‚จ QUADTREE๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. ์ธ์ž

์ž…๋ ฅ ๋ฌธ์ž์—ด์—์„œ ์–ด๋””๊นŒ์ง€ ์ฝ์—ˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ์žฌ๊ท€ํ•จ์ˆ˜์˜ ๊ฐ ๋‹จ๊ณ„์—์„œ ์–ด๋””์„œ๋ถ€ํ„ฐ QUADTREE ๋ณ€ํ™˜์„ ์‹œ์ž‘ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ '์ด๋ฒˆ์— ์ฝ์„ ์ž…๋ ฅ ๋ฌธ์ž์—ด ์œ„์น˜'๋ฅผ ์ค€๋‹ค. CLOCKSYNC์—์„œ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ cnt๋ฅผ ์ธ์ž๋กœ ๊ฐ€์กŒ๋˜ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์žฌ๊ท€์ ์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•  ๊ฐ’๋“ค์˜ ๊ฒฝ์šฐ ์ธ์ž๋กœ ์„ค์ •ํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค.

  1. base case

base case๋Š” ๋‹น์—ฐํžˆ 'b', 'w'์™€ ๊ฐ™์ด ํ•œ ์ƒ‰์˜ ํƒ€์ผ๋กœ ์ด๋ค„์ง„ ๊ฒฝ์šฐ์ด๋‹ค. ์ฆ‰, ์ด๋ฒˆ์— ์ฝ์„ ์ž…๋ ฅ ๋ฌธ์ž์—ด ์œ„์น˜์— 'b' ๋˜๋Š” 'w'๊ฐ€ ์“ฐ์—ฌ ์žˆ๋‹ค๋ฉด ๊ณง์žฅ ๋ฌธ์ž์—ด "b" ๋˜๋Š” "w"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. recursive step

์ด๋ฒˆ์— ์ฝ์„ ์ž…๋ ฅ ๋ฌธ์ž์—ด ์œ„์น˜์— 'x'๊ฐ€ ์“ฐ์—ฌ ์žˆ๋‹ค๋ฉด ์žฌ๊ท€์ ์œผ๋กœ sub-tree๋ฅผ ์ƒํ•˜๋ฐ˜์ „ ์‹œ์ผœ์ค˜์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, ์ˆœ์„œ๋Œ€๋กœ upper-left, upper-right, lower-left, lower-right๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋’ค์ง‘์–ด์ฃผ๊ณ , lower-left, lower-right, upper-left, upper-right ์ˆœ์œผ๋กœ sub-tree์˜ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘์–ด ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

base case์™€ recursive step์„ ์ •ํ•˜๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ๋ฌธ์ œ๊ฐ€ ์‹ค์ œ๋กœ ์ œํ•œ์‹œ๊ฐ„ ๋‚ด์— ํ’€๋ฆด์ง€ ๊ณ ๋ คํ•ด๋ด์•ผ ํ•œ๋‹ค. ๋Œ€์ฒด, ์™œ, ์–ด์งธ์„œ ํ•™๋ถ€๋•Œ๋ถ€ํ„ฐ ํ•ญ์ƒ ๊นŒ๋จน๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” master theorem์ด ์‚ฌ์šฉ๋œ๋‹ค.

masterthm

T(n) = 4 * T(n/4) + n ์ด๋ฏ€๋กœ T(n) = nlgn์ด๊ณ , ์ด๋Š” ์ œํ•œ ์‹œ๊ฐ„์— ๋ฌธ์ œ๋ฅผ ์ถฉ๋ถ„ํžˆ ํ’€ ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค€๋‹ค.


string solve(int pos)
{
    // base case.
    if (QUADTREE[pos] != 'x')
    {
        return QUADTREE.substr(pos,  1);
    }

    // recursive step.
    string ul, ur, ll, lr;
    ul = solve(pos + 1);
    ur = solve(pos + 1 + ul.size());
    ll = solve(pos + 1 + ul.size() + ur.size());
    lr = solve(pos + 1 + ul.size() + ur.size() + ll.size());

    return "x" + ll + lr + ul + ur;
}


###๋ฌธ์ œID : FENCE(AOJ_FENCE.cpp)

2017.01.07.(ํ† ).

์˜์™ธ๋กœ 2๋ฒˆ์ด๋‚˜ ์˜ค๋‹ต์„ ๋ƒˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ IDE์—์„œ ์ฝ˜์†” ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ์— freopen(*)์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ submitํ•  ๋•Œ ์ด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์ œ์ถœํ•ด์„œ ์˜ค๋‹ต์„ ๊ฒช์—ˆ๋‹ค. #ifdef ๊ตฌ๋ฌธ ๋“ฑ์„ ํ™œ์šฉํ•ด์„œ ์•ž์œผ๋กœ ๋น„์Šทํ•œ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋‘ ๋ฒˆ์งธ ์˜ค๋‹ต์€ ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ๊ณ„์—์„œ s, e(๋˜๋Š” lo, hi)์˜ indexing ์‹ค์ˆ˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ๋‹ค. ํ•ญ์ƒ ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ indexing์„ ์‹ค์ˆ˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด ์—ญ์‹œ ์ง์ ‘ ๋ช‡๋ช‡ case๋ฅผ ์†์œผ๋กœ ํ’€์–ด๋ณด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ทน๋ณตํ•˜๋Š” ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋ถ„ํ• ์ •๋ณต ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ถ„ํ•  ์ •๋ณต ๋‹จ์›์— ์ˆ˜๋ก๋˜์–ด์„œ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฑด์ง€, ์‹ค์ œ๋กœ ๋ถ„ํ•  ์ •๋ณต์ด ๋– ์˜ค๋ฅด๋Š” ๋ฌธ์ œ ํ˜•์‹์ด์–ด์„œ ๊ทธ๋žฌ๋˜ ๊ฒƒ์ธ์ง€๋Š” ์Šค์Šค๋กœ ๋งค์šฐ ์˜์‹ฌ์Šค๋Ÿฝ์ง€๋งŒ ์šฐ์„  ํ’€๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ตœ๋Œ€์˜ ๋„“์ด๋ฅผ ๊ฐ–๋Š” ์ง์‚ฌ๊ฐํ˜•์€ ์•„๋ž˜์˜ 3๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜์— ๋ฐ˜๋“œ์‹œ ์†ํ•œ๋‹ค.

  1. [s, m) ๊ตฌ๊ฐ„์˜ fence๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ.
  2. (m, e] ๊ตฌ๊ฐ„์˜ fence๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ.
  3. m์„ ํฌํ•จํ•˜๋Š” fence์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ.

1, 2.๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, 3.์˜ ๊ฒฝ์šฐ ์•ฝ๊ฐ„์€ ๊ณ ๋ฏผ์Šค๋Ÿฌ์› ๋‹ค. ์ฒ˜์Œ์—๋Š” m์„ ํฌํ•จํ•˜๋Š” fence์˜ ์ง‘ํ•ฉ์„ ์–ด๋””๊นŒ์ง€(์–ด๋А ํฌ๊ธฐ๊นŒ์ง€) ๊ณ ๋ คํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•ด ๊ธฐ์ค€์ด ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐ์„ ํ•ด๋ณด์•˜๋Š”๋ฐ ๋ช‡๋ช‡ ๋ฐ˜๋ก€๋ฅผ ์ง์ ‘ ์†์œผ๋กœ ํ’€๋ฉด์„œ ๋งŒ๋“ค์–ด๋ณด๋‹ˆ ๊ฒฐ๊ตญ [s, e]๊ตฌ๊ฐ„ ์ „์ฒด์— ๋Œ€ํ•ด์„œ ๊ณ ๋ คํ•ด์ฃผ์–ด์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค(์ฆ‰, ์ „-ํƒ์ƒ‰). 3.์„ ํšจ์œจ์ ์œผ๋กœ ๊ณ ๋ คํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค m์˜ ์ขŒ/์šฐ์ธก ์ธ์ ‘ fence ์ค‘ ๋” ๋†’์€ ๋†’์ด๋ฅผ ๊ฐ–๋Š” fence ์ชฝ์œผ๋กœ ํ™•์žฅํ•ด๊ฐ€๋ฉด์„œ ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ greedy property๋ฅผ ์ฆ๋ช…ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ •๋‹น์„ฑ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์–ด๋А ํ•œ ๋‹จ๊ณ„์—์„œ ์ขŒ/์šฐ์ธก์˜ fence l, r ์ค‘ ๋” ๋‚ฎ์€ fence l ์ชฝ์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ์ง์‚ฌ๊ฐํ˜•์˜ ์ตœ๋Œ€ ๋„’์ด x๋ฅผ ์–ป์—ˆ๋‹ค๊ณ  ํ•˜์ž. ๋งŒ์•ฝ, ๊ทธ๋Ÿฌํ•œ ๋‹จ๊ณ„์—์„œ r ์ชฝ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ l๋กœ ํ™•์žฅํ•˜๋”๋ผ๋„ x์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ, ๋ฌธ์ œ๋ฅผ 1, 2, 3.์œผ๋กœ ๋ถ„ํ•  ์ •๋ณตํ•˜๋Š” ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ T(n)=2*T(n/2) + n๊ณผ ๊ฐ™์ด ๋ณต์žก๋„๋ฅผ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๊ณ  master theorem์— ์˜ํ•ด T(n)=O(nlgn)์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์ œํ•œ ์‹œ๊ฐ„ ๋‚ด์— ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„๋ณต์žก๋„์ด๋‹ค. ๊ตฌํ˜„๊ณผ ๊ด€๋ จํ•ด์„œ ์ฃผ์˜ํ•  ๋งŒํ•œ ์‚ฌํ•ญ์œผ๋กœ๋Š” ์ฃผ์–ด์ง„ ๊ตฌ๊ฐ„ [s, e]์— ๋Œ€ํ•˜์—ฌ 3.์˜ ๊ณผ์ •์—์„œ (-INF, s) ๋˜๋Š” (e, +INF) ๋ฒ”์œ„์˜ fence๋ฅผ ๊ณ ๋ คํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ ์ ˆํžˆ ์ž˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ์ ์ด ์žˆ๋‹ค. ๊ตฌ๊ฐ„ ๋ฐ–์˜ ์›์†Œ๋ฅผ -INF๋กœ ํ•˜์—ฌ data guard๋ฅผ ๋‘๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚œ ๊ทธ๋ƒฅ ๋ถ„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.


int solve(int s, int e)
{
    // base cases.
    if (s > e)
        return 0;
    if (s == e)
        return FENCES[s];

    // recursive step(divide in 3 cases).
    int m = (s + e) / 2;
    int lsub = solve(s, m - 1);
    int rsub = solve(m + 1, e);

    int l = m;
    int r = m;
    int h = FENCES[m];
    int msub = FENCES[m];

    while (s <= l && r <= e)
    {
        int lh = (l - 1 < s) ? 0 : FENCES[l - 1];
        int rh = (r + 1 > e) ? 0 : FENCES[r + 1];

        if (lh < rh)
        {
            ++r;
            h = min(h, rh);
            msub = max(msub, h * (r - l + 1));
        }
        else
        {
            --l;
            h = min(h, lh);
            msub = max(msub, h * (r - l + 1));
        }
    }

    return max(msub, max(lsub, rsub));
}



###๋ฌธ์ œID : FANMEETING(AOJ_FANMEETING.cpp)

2017.01.14.(ํ† ).

๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๋ฌด์—‡์ธ๊ฐ€ ๋น„ํŠธ ์—ด์˜ ๊ณฑ์…‰์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด ๋˜๊ฒ ๋‹ค๋Š” ๊ฐ์„ ์žก๋Š”๋ฐ๋Š” ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ๋ฌธ์ œ ํ’€์ด์˜ ํ•ต์‹ฌ์ด์—ˆ๋˜ Karatsuba๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š” ๋ฐ๋Š” ์‹คํŒจํ–ˆ๋‹ค. Karatsuba ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‘์šฉํ•˜๋ฉด O(n^2) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ O(n^lg3) ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. x๋ช…์˜ ๋ฉค๋ฒ„๋ฅผ M(1) ~ M(x)๋กœ, y๋ช…์˜ ํŒฌ์„ F(1) ~ F(y)๋กœ ํ‘œํ˜„ํ•˜๊ธฐ๋กœ ํ•˜์ž. ๋ฉค๋ฒ„์™€ ํŒฌ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์„ ๊ณฑ์…ˆ ์„ธ๋กœ์‹์ฒ˜๋Ÿผ ์ ์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

mult

์œ„์˜ ์„ธ๋กœ์‹ ๊ณฑ์…ˆ์„ ๋ณด๋ฉด ๊ณฑ์…ˆ ๊ฒฐ๊ณผ์˜ x-1๋ฒˆ์งธ ์ž๋ฆฌ๋ถ€ํ„ฐ y-1๋ฒˆ์งธ ์ž๋ฆฌ๊ฐ€ ๊ฐ๊ฐ ํ•œ ๋ฒˆ์˜ ๋ผ์šด๋“œ์—์„œ ์ด๋ค„์ง€๋Š” ์•…์ˆ˜ ๋˜๋Š” ํ—ˆ๊ทธ์˜ ์กฐํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 'M'์„ 1๋กœ, 'F'๋ฅผ 0์œผ๋กœ ์ž๋ฆฌ์˜ฌ๋ฆผ์„ ๋ฌด์‹œํ•˜์—ฌ ์„ธ๋กœ์‹์„ ๊ณ„์‚ฐํ•œ๋‹ค๋ฉด [x-1, y-1]๊ตฌ๊ฐ„์˜ 0์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๊ณง ์ „์ฒด ํฌ์˜น์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ, '์ž๋ฆฌ์˜ฌ๋ฆผ์„ ๋ฌด์‹œํ•˜์—ฌ'๋ผ๋Š” ๋ถ€๋ถ„์ด ๊ตฌํ˜„ํ•  ๋•Œ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ด๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ๊ณฑํ•˜๋Š” ์ˆซ์ž๋“ค์ด ๋ชจ๋‘ x์ง„๋ฒ•์˜ ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ธ๋กœ์‹์„ ์‚ดํŽด๋ณด๋ฉด ๊ฒฐ๊ณผ๊ฐ’์˜ ๊ฐ ์ž๋ฆฌ์ˆ˜๋Š” ์ตœ๋Œ€ x๊ฐœ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ณฑํ•˜๋ ค๋Š” ์ˆ˜๋Š” ๋ชจ๋‘ 0 ๋˜๋Š” 1์ด๋ฏ€๋กœ x์ง„๋ฒ•์„ ๊ฐ€์ •ํ•˜๋ฉด ์ž๋ฆฌ์˜ฌ๋ฆผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด์ œ ๋‘ ์ˆ˜์˜ ๊ณฑ์—์„œ [x-1, y-1]๊ตฌ๊ฐ„์˜ 0์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ „์ฒด ํฌ์˜น์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜์ธ ๊ฒƒ์„ ์•Œ์•˜์œผ๋‹ˆ Karatsuba ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ๋‘ ์ˆ˜๋ฅผ ๋น ๋ฆฌ๊ฒŒ ๊ณฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. ๊ณฑํ•˜๊ธฐ ์›ํ•˜๋Š” ๋‘ ์ˆ˜ a(y์ž๋ฆฌ์ˆ˜)์™€ b(x์ž๋ฆฌ์ˆ˜)๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž(y>=x๋ผ๊ณ  ๊ฐ€์ •). a, b์— ๋Œ€ํ•ด์„œ ์ƒ์œ„ ํ•˜์œ„ m์ž๋ฆฌ์ˆ˜์™€ ์ƒ์œ„ y-m์ž๋ฆฌ ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋ฉด axb๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋‹ค(0<=m<=y).

a x b

= (a1 x BASE^m + a0) x (b1 x BASE^m + b0)

= a1 x b1 x BASE^2m + (a1 x b0 + a0 x b1) x BASE^m + a0 x b0

BASE^m, BASE^2m ์—ฐ์‚ฐ์€ ๋‹จ์ˆœํ•œ shift ์—ฐ์‚ฐ์ด๋ฏ€๋กœ ๊ณฑ์…ˆ์œผ๋กœ ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์œ„์˜ ๊ณฑ์…ˆ์—๋Š” ์ด 4ํšŒ์˜ ๊ณฑ์…ˆ์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค. Karatsuba๋Š” ์—ฌ๊ธฐ์„œ ํ•„์š”ํ•œ ๊ณฑ์…ˆ์˜ ํšŸ์ˆ˜๋ฅผ 3ํšŒ๋กœ ์ค„์ด๋Š”๋ฐ (a1 x b0 + a0 x b1) = (a0 + a1) x (b0 + b1) - a1 x b1 - a0 x b0์ž„์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋งค ๋‹จ๊ณ„ m์˜ ๊ฐ’์„ ์ž๋ฆฌ์ˆ˜์˜ ์ ˆ๋ฐ˜(์˜ค์ฐจ1)๋กœ ์„ค์ •ํ•œ๋‹ค๋ฉด ๊ณ„์‚ฐ์˜ ๋ณต์žก๋„๋Š” T(n) = 3T(n/2) + cn๊ณผ ๊ฐ™์ด ํ‘œํ˜„๋œ๋‹ค. ์—ฌ๊ธฐ์„œ cnํ•ญ์€ ์ ˆ๋ฐ˜์— ๊ฐ€๊น๊ฒŒ ๋‚˜๋ˆˆ ์ˆ˜๋“ค์˜ ๋ง์…ˆ ๋ฐ ๋บ„์…ˆ์— ์†Œ๋น„๋˜๋Š” ๊ณ„์‚ฐ๋Ÿ‰์„ ์˜๋ฏธํ•œ๋‹ค. ์—ญ์‹œ, master ์ •๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด๋ณด๋ฉด ๊ณ„์‚ฐ์˜ ๋ณต์žก๋„๊ฐ€ O(n^lg3)์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


vector<int> dq(const vector<int>& a, const vector<int>& b)
{
    int asize = a.size();
    int bsize = b.size();

    // base case.
    if (asize == 0 || bsize == 0)
        return vector<int>();
    if (asize < bsize)
        return dq(b, a);
    if (asize <= THRESHOLD)
        return bf(a, b);

    // recursive step.
    int m = asize / 2;
    vector<int> a0(a.begin(), a.begin() + m);
    vector<int> a1(a.begin() + m, a.end());
    vector<int> b0(b.begin(), b.begin() + min<int>(b.size(), m));
    vector<int> b1(b.begin() + min<int>(b.size(), m), b.end());

    vector<int> z0 = dq(a0, b0);
    vector<int> z2 = dq(a1, b1);

    add(a0, a1, 0);
    add(b0, b1, 0);
    vector<int> z1 = dq(a0, b0);
    sub(z1, z0, 0);
    sub(z1, z2, 0);

    vector<int> ret;
    add(ret, z0, 0);
    add(ret, z1, m);
    add(ret, z2, m + m);

    return ret;
}



###๋ฌธ์ œID : WILDCARD(AOJ_WILDCARD.cpp)

2017.02.05.(์ผ).

ํ‘ผ์ง€ ๊ฝค ๋ฌ๋Š”๋ฐ, ๊ทธ ๋™์•ˆ README๋ฅผ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ชปํ•ด์„œ ํ•œ ๋ฒˆ์— ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์•Œ๊ธฐ ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

WILDCARD๋ฅผ ํฌํ•จํ•˜๋Š” ํŒจํ„ด์„ ๋‚˜ํƒ€๋‚ด๋Š” pattern[0...n], ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ๋ฌธ์ž์—ด str[0...m]์ด ์ฃผ์–ด์งˆ ๋•Œ, str[0...m]์ด pattern[0...n]์œผ๋กœ ํ‘œํ˜„๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์ธ์ง€์˜ ์—ฌ๋ถ€๋ฅผ true or false๋กœ ๊ตฌํ•˜๋ผ.

๊ฐ„๋‹จํ•˜๊ฒŒ DP๋ฅผ ์ ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•˜์ž.

SUB[i][j] := **pattern[i...n]**๊ณผ **str[j...m]**์ด ๋งค์นญ์ด ๊ฐ€๋Šฅํ•œ์ง€์˜ ์—ฌ๋ถ€. true or false.

์œ„์™€ ๊ฐ™์ด ์ •์˜๋œ ๋ถ€๋ถ„๋ฌธ์ œ SUB[i][j]๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ base case์™€ recursive step์„ ํ‘œํ˜„ํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

SUB[i][j] =

base case 1) i == n์ธ ๊ฒฝ์šฐ,

๋” ์ด์ƒ ๋Œ€์‘ ์‹œํ‚ฌ pattern์ด ์—†๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ j == m(์ฆ‰, str๋„ ๋ชจ๋‘ ์†Œ๋น„)์ธ ๊ฒฝ์šฐ์—๋งŒ true, ์•„๋‹Œ ๊ฒฝ์šฐ false.

base case 2) j == m์ธ ๊ฒฝ์šฐ,

๋” ์ด์ƒ ์†Œ๋น„ํ•  str์ด ์—†๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ pattern[i...n]์ด ๋ชจ๋‘ '*'๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ i == n(์ฆ‰, pattern๋„ ๋ชจ๋‘ ์†Œ๋น„)์ธ ๊ฒฝ์šฐ์—๋งŒ true, ์•„๋‹Œ ๊ฒฝ์šฐ false.

recursive step 1) pattern[i] != '*' && pattern[i] != '?'์ธ ๊ฒฝ์šฐ,

pattern[i] != str[j]์ธ ๊ฒฝ์šฐ false, ์•„๋‹Œ ๊ฒฝ์šฐ SUB[i + 1][j + 1].

recursive step 2) pattern[i] == '*'์ธ ๊ฒฝ์šฐ,

j + 1 <= idx <=m ์ธ idx์— ๋Œ€ํ•˜์—ฌ SUB[i + 1][idx]๊ฐ€ ๋ชจ๋‘ false์ธ ๊ฒฝ์šฐ์—๋งŒ false, ์•„๋‹Œ ๊ฒฝ์šฐ true.

recursive step 3) pattern[i] == '?'์ธ ๊ฒฝ์šฐ

SUB[i + 1][j + 1].


char solve(int wIdx, int nIdx)
{
    // base cases.
    if (wIdx == WILD.size())
        return (nIdx == NAME.size()) ? TRUE : FALSE;
    if (nIdx == NAME.size())
    {   
        int idx;
        for (idx = wIdx; idx < WILD.size() && WILD[idx] == '*'; ++idx);

        return (idx == WILD.size()) ? TRUE : FALSE;
    }   

    // dp step.
    char& ret = CACHE[wIdx][nIdx];
    if (ret == 0)
    {   
        // dp.
        if (WILD[wIdx] == '?')
            ret = solve(wIdx + 1, nIdx + 1); 
        else if (WILD[wIdx] == '*')
        {
            ret = FALSE;
            for (int rep = 0; rep <= NAME.size() - nIdx; ++rep)
            {
                if (solve(wIdx + 1, nIdx + rep) == TRUE)
                {
                    ret = TRUE;
                    break;
                }
            }
        }
        else
            ret = (WILD[wIdx] == NAME[nIdx] && solve(wIdx + 1, nIdx + 1) == TRUE) ? TRUE : FALSE;
    }   

    return ret;
}



###๋ฌธ์ œID : TRIANGLEPATH(AOJ_TRIANGLE.cpp)

2017.02.05.(์ผ).

๊ตณ์ด README๋ฅผ ์ ์„ ํ•„์š”๊ฐ€ ๋А๊ปด์ง€์ง€ ์•Š์„ ์ •๋„๋กœ ์‰ฌ์šด DP๋ฌธ์ œ์— ์†ํ•œ๋‹ค. ๋‹ค๋งŒ, ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๋ถ€๋ถ„๋ฌธ์ œ์˜ ์ •์˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ƒ์— ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ณผ์ •์ด ๊ฐ„๋‹จํ•ด ์งˆ ์ˆ˜๋„, ๋ณต์žกํ•ด ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•„๋‘๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„์›€์ด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด ๋ฌธ์ œ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ถ€๋ถ„๋ฌธ์ œ์˜ ์ •์˜๋ฅผ ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฉ๋ฒ•1. SUB[i][j] := arr[i][j]์—์„œ ์‹œ์ž‘ํ•˜๋Š” TRIANGLEPATH์˜ ์ตœ๋Œ€ ํ•ฉ.

๋ฐฉ๋ฒ•2. SUB[i][j] := arr[i][j]์—์„œ ์ข…๋ฃŒํ•˜๋Š” TRIANGLEPATH์˜ ์ตœ๋Œ€ ํ•ฉ.

๋งŒ์•ฝ, ์ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ ๋ฐฉ๋ฒ•2.์˜ ์ ‘๊ทผ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ชจ๋“  ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚ธ ํ›„ ์‚ผ๊ฐํ˜•์˜ ๋ฐ‘๋ณ€์— ์œ„์น˜ํ•˜๋Š” ์›์†Œ๋“ค์— ๋Œ€ํ•ด์„œ ์ตœ๋Œ€ ๊ฐ’์„ ๊ฐ–๋Š” ์œ„์น˜๋ฅผ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ์ฐพ์•„์ฃผ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด, ๋ฐฉ๋ฒ•1.์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค๋ฉด ๋ชจ๋“  ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚ธ ํ›„ ๋‹จ์ง€ ์‚ผ๊ฐํ˜•์˜ ์œ— ๊ผญ์ง€์ ์— ์œ„์น˜ํ•œ ์›์†Œ์˜ ๊ฐ’์ด ๊ณง ๋‹ต์ด ๋  ๊ฒƒ์ด๋‹ค(๋ชจ๋“  TRIANGLEPATH๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ ์œ„์น˜์—์„œ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ). ๋ฐฉ๋ฒ•1.์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ, base case์™€ recursive step์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค(์‚ผ๊ฐํ˜•์˜ ๋†’์ด๋ฅผ h๋ผ๊ณ  ํ•˜์ž).

SUB[i][j] :=

base case) i == h - 1์ธ ๊ฒฝ์šฐ,

๋” ์ด์ƒ ๊ฐ€๋Šฅํ•œ TRIANGLEPATH๊ฐ€ ์—†์œผ๋ฏ€๋กœ arr[i][j]์˜ ๊ฐ’๊ณผ ๊ฐ™๋‹ค. recursive step) i != h - 1์ธ ๊ฒฝ์šฐ, arr[i][j]๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ๋‘ TRIANGLEPATH์— ๋Œ€ํ•ด์„œ ๋” ํฐ ์ชฝ์„ ๋‹ต์œผ๋กœ ํ•œ๋‹ค. ์ฆ‰, arr[i][j] + max(SUB[i+1][j], SUB[i+1][j+1]).


for (int h = H - 2; h >= 0; --h)
{
    for (int idx = 0; idx < h + 1; ++idx)
        TRIANGLE[h][idx] += MAXVAL(TRIANGLE[h + 1][idx], TRIANGLE[h + 1][idx + 1]);
}


###๋ฌธ์ œID : LIS(AOJ_LIS.cpp)

2017.02.05.(์ผ).

์•„์ฃผ ์œ ๋ช…ํ•œ DP๋ฌธ์ œ๋กœ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค. DPํ•ด๋ฒ• ์ด์™ธ์—๋„ O(nlgn)์งœ๋ฆฌ ์†”๋ฃจ์…˜์ด ์•Œ๋ ค์ ธ ์žˆ๋‹ค. ์ด ํ’€์ด๋Š” DPํ’€์ด ๋ฐฉ๋ฒ•์„ ๋ณด์ธ๋‹ค. ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ •์˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.

SUB[i] := arr[i]์—์„œ ๋๋‚˜๋Š” LIS์ค‘ ์ตœ๋Œ€์˜ ๊ธธ์ด.

์œ„์˜ ์ •์˜์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ํ’€์–ด์ฃผ๊ณ  arr์˜ ๋ชจ๋“  ์›์†Œ์— ๋Œ€ํ•ด SUB์˜ ์ตœ๋Œ€ ๊ฐ’์„ ์ฐพ์•„์ฃผ๋ฉด ๋‹ต์ด ๋œ๋‹ค. SUB[i]๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ base case์™€ recursive step์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค(arr์˜ ๊ธธ์ด๋ฅผ len์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค).

SUB[i] =

base case) i == 0์ธ ๊ฒฝ์šฐ,

LIS๋ฅผ ๋” ์ด์ƒ ๋งŒ๋“ค์–ด ๋‚˜๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” LIS๋Š” {arr[0]}์ด๋‹ค. ๋”ฐ๋ผ์„œ, SUB[i] = 1. recursive step) i != 0์ธ ๊ฒฝ์šฐ, 0 <= idx < i์ธ idx์— ๋Œ€ํ•ด์„œ SUB[i] = 1 + max(SUB[idx])์ด๋‹ค. ์ฆ‰, ๊ฐ€์žฅ ๊ธด LIS์˜ ๋’ค์— ์ž๊ธฐ ์ž์‹ ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.


// solve.
for (int cur = 0; cur < N; ++cur)
{
    CACHE[cur] = 1;
    for (int pre = cur - 1; pre >= 0; --pre)
    {
        if (NUMBERS[pre] < NUMBERS[cur])
            CACHE[cur] = MAXVAL(CACHE[cur], CACHE[pre] + 1); 
    }
}


###๋ฌธ์ œID : JLIS(AOJ_JLIS.cpp)

2017.02.05.(์ผ).

LIS์—์„œ ์กฐ๊ธˆ์˜ ๋ณ€ํ˜•์„ ๊ฐ€ํ•œ ๋ฌธ์ œ์— ๋ถˆ๊ณผํ–ˆ๋Š”๋ฐ, base case ์„ค์ •์„ ์ž˜๋ชปํ•ด์„œ ํ‘ธ๋Š”๋ฐ ์• ๋ฅผ ๋จน์—ˆ๋‹ค. ์ด ๋ฌธ์ œ์˜ ๋ถ€๋ถ„๋ฌธ์ œ ์ •์˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜์˜€๋‹ค(A์˜ ๊ธธ์ด๋ฅผ n, B์˜ ๊ธธ์ด๋ฅผ m์ด๋ผ๊ณ  ํ•˜์ž).

SUB[i][j] := A[i], B[j]์—์„œ ์‹œ์ž‘ํ•˜๋Š” JLIS์ค‘ ์ตœ๋Œ€์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” JLIS์˜ ๊ธธ์ด.

์—ฌ๊ธฐ์„œ, "A[i], B[j]๋กœ ์‹œ์ž‘ํ•˜๋Š”"์˜ ์˜๋ฏธ๋Š” JLIS์— ํฌํ•จ๋œ ์›์†Œ ์ค‘ A์— ์†ํ•˜๋Š” ๋ชจ๋“  ์›์†Œ๋Š” A[i...n-1]์—์„œ๋งŒ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ๊ณ , B์— ์†ํ•˜๋Š” ๋ชจ๋“  ์›์†Œ๋Š” B[j...m-1]์—์„œ๋งŒ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SUB[i][j]๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋– ์˜ฌ๋ ค๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

case1. A[i] ... B[j] ...

case2. B[j] ... A[i] ...

case3. (A[i] == B[j]) ...

์œ„์—์„œ ๋ณด์ธ ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ๋ฅผ ์—ผ๋‘์— ๋‘๊ณ , SUB[i][j]๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ base case์™€ recursive step์„ ๋ณด์ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

base case1) i == n์ธ ๊ฒฝ์šฐ,

SUB[i][j]๋Š” B์˜ ์›์†Œ๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๋Š” LIS์˜ ๊ธธ์ด์™€ ๊ฐ™๋‹ค.

base case2) j == m์ธ ๊ฒฝ์šฐ,

SUB[i][j]๋Š” A์˜ ์›์†Œ๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๋Š” LIS์˜ ๊ธธ์ด์™€ ๊ฐ™๋‹ค.

recursive step1) **A[i] < B[j]**์ธ ๊ฒฝ์šฐ(case1.์— ํ•ด๋‹น),

i < ni <= n, A[i] < A[ni]์ธ ni์— ๋Œ€ํ•ด์„œ SUB[i][j] = 1 + max(SUB[ni][j])

recursive step2) **A[i] > B[j]**์ธ ๊ฒฝ์šฐ(case2.์— ํ•ด๋‹น),

j < nj <= m, B[j] < B[nj]์ธ nj์— ๋Œ€ํ•˜์—ฌ SUB[i][j] = 1 + max(SUB[i][nj])

recursive step3) **A[i] == B[j]**์ธ ๊ฒฝ์šฐ(case3.์— ํ•ด๋‹น),

i < ni <= n, A[i] < A[ni], j < nj <= m, B[j] < B[nj]์ธ ni, nj์— ๋Œ€ํ•˜์—ฌ SUB[i][j] = 1 + max(SUB[i+1][j+1])

์‚ฌ์‹ค ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ํ’€ ๋•Œ, "SUB[i][j] := A[i], B[j]๋กœ ๋๋‚˜๋Š” JLIS์ค‘ ์ตœ๋Œ€์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” JLIS์˜ ๊ธธ์ด"๋กœ ์ •์˜ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ์—๋„ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜๋Š” ์žˆ๋‹ค. ์ด ๋•Œ, ๋๊นŒ์ง€ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ์€ base case1, 2 ์˜€๋Š”๋ฐ ์–ด๋””์—์„ ๊ฐ€ ๋ฐ˜๋“œ์‹œ A ๋˜๋Š” B๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ LIS๋ฅผ ํ’€์–ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์บ์น˜ํ•˜์ง€ ๋ชปํ•ด ๋ฌธ์ œ๋ฅผ ํ’€์ง€ ๋ชป ํ–ˆ์—ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” base case๋ฅผ ์„ค์ •ํ•  ๋•Œ ์ฃผ์˜ํ•˜๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.


// padding.
A[N] = B[M] = MAXNUM;

for (int i = N - 1; i >= 0; --i)
{
    CACHE[i][M] = 1;
    for (int ni = i + 1; ni < N; ++ni)
    {
        if (A[i] < A[ni])
            MAX_UPDATE(CACHE[i][M], 1 + CACHE[ni][M]);
    }
}
for (int j = M - 1; j >= 0; --j)
{
    CACHE[N][j] = 1;
    for (int nj = j + 1; nj < M; ++nj)
    {
        if (B[j] < B[nj])
            MAX_UPDATE(CACHE[N][j], 1 + CACHE[N][nj]);
    }
}
CACHE[N][M] = 0;

// solve.
for (int i = N - 1; i >= 0; --i)
{
    for (int j = M - 1; j >= 0; --j)
    {
        CACHE[i][j] = (A[i] == B[j]) ? 1 : 2;
        if (A[i] < B[j])
        {
            for (int ni = i + 1; ni <= N; ++ni)
            {
                if (A[i] < A[ni])
                    MAX_UPDATE(CACHE[i][j], 1 + CACHE[ni][j]);
            }
        }
        else if (A[i] > B[j])
        {
            for (int nj = j + 1; nj <= M; ++nj)
            {
                if (B[j] < B[nj])
                    MAX_UPDATE(CACHE[i][j], 1 + CACHE[i][nj]);
            }
        }
        else
        {
            for (int ni = i + 1; ni <= N; ++ni)
            {
                for (int nj = j + 1; nj <= M; ++nj)
                {
                    if (A[i] < A[ni] && B[j] < B[nj])
                        MAX_UPDATE(CACHE[i][j], 1 + CACHE[ni][nj]);
                }
            }
        }
    }
}



###๋ฌธ์ œID : PI(AOJ_PI.cpp)

2017.02.06.(์›”).

์ „ํ˜•์ ์ธ DP๋ฌธ์ œ๋กœ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๊ตณ์ด ๊นŒ๋‹ค๋กœ์šด ์ ์„ ์ฐพ์•„๋ณด์ž๋ฉด ๋ฌธ์ž์—ด์˜ ์—ฐ์†ํ•œ 3~5์ž๋ฆฌ ํ˜•ํƒœ์— ๋”ฐ๋ผ ๋‚œ์ด๋„๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ ์ด๋Š” ์•„๋ž˜์˜ ์‚ฌ์‹ค์„ ๊นจ๋‹ซ์œผ๋ฉด ์‰ฝ๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ž์—ด์„ 3~5์ž๋ฆฌ๋กœ ๋Š์–ด ์ฝ๋Š” ๊ฒฝ์šฐ๋งŒ ์ƒ๊ฐํ•œ๋‹ค. 8์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์žˆ์„ ๋•Œ 3/3/2์™€ ๊ฐ™์ด ๋Š์–ด ์ฝ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

problem description์— ๋ช‡ ์ค„ ๋” ์ ํ˜€์žˆ์œผ๋ฉด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์‚ฌ๋žŒ๋“ค์ด ํ˜ผ๋ž€ ์—†์ด ํ’€ ์ˆ˜ ์žˆ์„ ๋“ฏํ•œ๋ฐ ๋ฌธ์ œ์˜ ์ถœ์ฒ˜๊ฐ€ CF๋ผ๊ณ ํ•˜๋‹ˆ ์ฐธ๊ณ  ๋„˜์–ด๊ฐ€๋Š” ์ˆ˜ ๋ฐ–์— ์—†์„ ๋“ฏ ํ•˜๋‹ค.

์ฃผ์–ด์ง„ ์ˆซ์ž๋ฅผ PI, PI์˜ ๊ธธ์ด๋ฅผ n์ด๋ผ๊ณ  ํ•  ๋•Œ, ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

SUB[i] := PI[i...n - 1]์„ ์™ธ์šฐ๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋‚œ์ด๋„.

์ •์˜๋œ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ base case, recursive step์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

base case1) i == n์ธ ๊ฒฝ์šฐ,

์™ธ์šธ ์ˆซ์ž๊ฐ€ ๋” ์ด์ƒ ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ SUB[i] = 0.

base case2) i == n - 1 ๋˜๋Š” i == n - 2์ธ ๊ฒฝ์šฐ,

์œ„์—์„œ ๋ฐํ˜”๋“ฏ ๋ชจ๋“  ์ˆซ์ž๋Š” 3~5์ž๋ฆฌ๋กœ ๋Š์–ด์„œ ์ผ์–ด์•ผ๋งŒ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, base case2์™€ ๊ฐ™์ด ํ•œ ๊ธ€์ž ๋˜๋Š” ๋‘ ๊ธ€์ž๋ฅผ ์™ธ์šฐ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์ด๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ๋‹ต์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก SUB[i] = +INF๋กœ ํ•œ๋‹ค.

recursive step) 0 <= i < n - 1์ธ ๊ฒฝ์šฐ,

PI[pos...pos + group - 1]๋กœ ํ‘œํ˜„๋˜๋Š” group(3 <= group <= 5)๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์™ธ์šฐ๊ธฐ ์œ„ํ•œ ๋‚œ์ด๋„๋ฅผ dif(pos, group)๋ผ๊ณ  ํ•˜์ž. ์ด ๋•Œ, SUB[i]๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ, array bound๋ฅผ ์ฒดํฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์— ์ฃผ์˜ ํ•œ๋‹ค.

SUB[i] = min(CACHE[i + group] + dif(i, group));


// base case.
CACHE[PI.length()] = 0;
CACHE[PI.length() - 1] = 10 * MAXLEN;
CACHE[PI.length() - 2] = 10 * MAXLEN;

// recursive step.
for (int idx = PI.length() - 3; idx >= 0; --idx)
{
    for (int group = 3; idx + group - 1 < PI.length() && group <= 5; ++group)
        CACHE[idx] = min(CACHE[idx], CACHE[idx + group] + difficulty(idx, group));
}

cout << CACHE[0] << endl;


###๋ฌธ์ œID : QUANTIZE(AOJ_QUANTIZE.cpp)

2017.02.09.(๋ชฉ).

์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š๊ณ  ํ’€ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋ง‰์ƒ ํ’€๊ณ ๋‚˜์„œ ์„ค๋ช…ํ•˜๋ คํ•˜๋ฉด ๊ฝค๋‚˜ ์• ๋ฅผ ๋จน์ด๋Š” ๋ฌธ์ œ์ด๋‹ค. ๊ฐ„ํ˜น, DP๋ฌธ์ œ์ธ ๊ฒƒ์„ ์•Œ๊ณ  ํ’€์ด๋ฅผ ์‹œ์ž‘ํ•˜๋”๋ผ๋„ ๋ถ€๋ถ„๋ฌธ์ œ ๊ด€๊ณ„์‹์„ ์ฐพ๋Š” ๊ฒƒ์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํ•ญ์ƒ ๊ธฐ๋ณธ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ brute-force ์†”๋ฃจ์…˜์„ ์ƒ๊ฐํ•ด๋ณด๋„๋ก ํ•˜์ž (์ฃผ์–ด์ง„ ์ˆ˜์—ด์„ ์ •๋ ฌํ•˜์—ฌ ***a[1], a[2], ... ,a[n]***๋ฅผ ์–ป์—ˆ๋‹ค๊ณ  ํ•˜๊ณ , ์ด ์ˆ˜์—ด์„ S๊ฐœ์˜ ์–‘์žํ™” ๊ฐ’ ***q[1], q[2], ... ,q[S]***๋กœ ์–‘์žํ™”ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•„๋ž˜ DPํ’€์ด๊ฐ€ ๋‹น์—ฐํ•˜๊ฒŒ ๋А๊ปด์ง)

์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„๋ฌธ์ œ์˜ ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ฃผ์–ด์ง„ ์ˆ˜์—ด์„ ์ •๋ ฌํ•˜์—ฌ ***a[1], a[2], ... ,a[n]***์„ ์–ป์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

SUB[f][q] := a[f...n]์„ q๊ฐœ์˜ ์–‘์ž ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์–‘์žํ™” ํ•  ๋•Œ ์˜ค์ฐจ ์ œ๊ณฑ์˜ ์ตœ์†Œ ํ•ฉ.

์œ„์™€ ๊ฐ™์ด ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด base case์™€ recursive step์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

base case1) f >= n + 1์ธ ๊ฒฝ์šฐ,

๋” ์ด์ƒ ์–‘์žํ™” ํ•ด์•ผํ•  ๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ ์˜ค์ฐจ๋Š” 0์ด๋‹ค.

base case2) f < n + 1์ด๊ณ  q <= 0์ธ ๊ฒฝ์šฐ,

์–‘์žํ™” ํ•ด์•ผํ•  ๊ฐ’์€ ๋‚จ์•„ ์žˆ์ง€๋งŒ ์–‘์žํ™”์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ๋‚จ์•„์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ +INF.

recursive step) f < n + 1 ์ด๊ณ  q > 0์ธ ๊ฒฝ์šฐ,

SUB[f][q] := min(sq_error(f, len) + SUB[f + len][q - 1])

์œ„์˜ recursive step์—์„œ ***sq_error(f, len)***์ด ๋“ฑ์žฅํ•˜๋Š”๋ฐ ์ด๋Š” "a[f...f + len - 1]์„ ํ•˜๋‚˜์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์–‘์žํ™” ํ•  ๋•Œ, ์˜ค์ฐจ ์ œ๊ณฑ์˜ ์ตœ์†Œ ํ•ฉ"์œผ๋กœ ์ •์˜๋œ๋‹ค. ์ด ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์€๋ฐ, ํ•˜๋‚˜์˜ ์–‘์žํ™”์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์— ๋Œ€ํ•˜์—ฌ ์ฃผ์–ด์ง„ ๊ตฌ๊ฐ„์˜ ์˜ค์ฐจ์˜ ์ œ๊ณฑ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ณต์‹์„ ์‚ดํŽด๋ณด๋ฉด ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

f(s, e, q) := a[s...e]๋ฅผ q๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–‘์žํ™” ํ•  ๋•Œ ์˜ค์ฐจ์˜ ์ œ๊ณฑ์˜ ํ•ฉ

= f(s, e, q)

= (a[s] - q)^2 + (a[s + 1] - q)^2 + ... + (a[e] - q)^2

= a[s]^2 + a[s + 1]^2 + ... + a[e]^2 + (e - s + 1)q^2 - 2q(a[s] + a[s + 1] + ... + a[e])

f(s, e, q)๋ฅผ q์— ๋Œ€ํ•ด ๋ฏธ๋ถ„ํ•˜์—ฌ f(s, e, q)๊ฐ€ ์ตœ์†Œ ๊ฐ’์„ ๊ฐ–๋Š” ์ง€์ ์„ ๊ตฌํ•ด๋ณด๋ฉด q = avg(a[s...e])์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ***sq_error(f, len)***์€ a[f...f + len - 1]์„ a[f...f + len - 1]์˜ ํ‰๊ท ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์–‘์žํ™” ํ•˜์˜€์„ ๋•Œ ์–ป์–ด์ง€๋Š” ์˜ค์ฐจ์˜ ์ œ๊ณฑํ•ฉ๊ณผ ๊ฐ™๋‹ค. ์ด๋•Œ, ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” S๊ฐœ์˜ ์–‘์žํ™”์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์€ ๋ชจ๋‘ ์ •์ˆ˜์ด๋ฏ€๋กœ ์–‘์žํ™”์— ์‚ฌ์šฉ๋  q๋ฅผ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์ •์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์— ์ฃผ์˜ํ•œ๋‹ค.


// init.
for (int row = 0; row < MAX_N + 1; ++row)
{
    for (int col = 0; col < MAX_Q + 1; ++col)
        CACHE[row][col] = MAX_VAL;
}
for (int row = 0; row < MAX_N + 1; ++row)
    CACHE[row][0] = MAX_VAL;
for (int col = 0; col < MAX_Q + 1; ++col)
    CACHE[N][col] = 0;

// sort.
sort(ARR, ARR + N);

// solve.
for (int f = N - 1; f >= 0; --f)
{
    for (int q = 1; q <= S; ++q)
    {
        int sum = ARR[f];
        int sqr = ARR[f] * ARR[f];

        for (int len = 1; f + len - 1 < N; ++len)
        {
            int avg = (int)((double)sum / len + 0.5);
            int var = sqr - 2 * avg * sum + len * avg * avg;

            MIN_UPDATE(CACHE[f][q], var + CACHE[f + len][q - 1]);

            sum += ARR[f + len];
            sqr += ARR[f + len] * ARR[f + len];
        }
    }
}


###๋ฌธ์ œID : TILING2(AOJ_TILING2.cpp)

2017.02.09.(๋ชฉ).

๋งค์šฐ ์‰ฌ์šด ๋ฌธ์ œ๋กœ DP์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ์ด๋‚˜, ์‚ฌ์‹ค ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ„ ์—†์–ด DP๋ฅผ ์“ธ ํ•„์š”๋„ ์—†๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํƒ€์ผ์˜ n๋ฒˆ์งธ ์œ„์น˜์—์„œ ํ•˜๋‚˜์˜ ์„ธ๋กœ ํƒ€์ผ๋กœ ๋๋‚˜๊ฑฐ๋‚˜, ๋‘๊ฐœ์˜ ๊ฐ€๋กœ ํƒ€์ผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ ์™ธ์—๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•„๋ž˜์˜ ์ ํ™”์‹์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

tile

SUB[i] := 2xi ํƒ€์ผ์„ ์ฑ„์šฐ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜

SUB[i] = SUB[i - 1] + SUB[i - 2]


int fibo(int n)
{
    if (n == 1)
        return 1;
    if (n == 2)
        return 2;

    int p = 2;
    int pp = 1;
    int cur = p + pp;

    for (int i = 3; i < n; ++i)
    {
        pp = p;
        p = cur;
        cur = (p + pp) % MOD;
    }

    return cur;
}


###๋ฌธ์ œID : TRIPATHCNT(AOJ_TRIPATHCNT.cpp)

2017.02.09.(๋ชฉ).

์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ๋Š” TRIANGLEPATH์™€ ๊ฑฐ์˜ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ TRIANGLEPATH์™€ 100% ์ผ์น˜ํ•˜๋ฉฐ, ์ด ๊ณผ์ •์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถ€๋ถ„๋ฌธ์ œ ํ•˜๋‚˜๋ฅผ ๋” ํ’€์–ด์ค€๋‹ค. h๊ฐ€ ํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ํ•˜์ž.

SUB2[i][j] := TRIANGLE[i][j]์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์ตœ๋Œ€ TRIANGLEPATH์˜ ๊ฐฏ์ˆ˜.

base case) i == h - 1์ธ ๊ฒฝ์šฐ,

์ตœ๋Œ€์˜ TRIANGLEPATH๊ฐ€ ๋‹จ, ํ•˜๋‚˜์˜ ์›์†Œ๋กœ ๊ตฌ์„ฑ๋˜๊ณ  ์œ ์ผํ•˜๋ฏ€๋กœ SUB2[i][j] = 1.

recursive step) 0 <= i < h - 1์ธ ๊ฒฝ์šฐ,

subcase1) **SUB[i + 1][j] > SUB[i + 1][j + 1]**์ธ ๊ฒฝ์šฐ,

๋ฐ”๋กœ ์•„๋ž˜ ์žˆ๋Š” ์›์†Œ๋ฅผ ์ด์šฉํ•ด์•ผ๋งŒ ์ตœ๋Œ€์˜ ๊ฒฝ๋กœ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ SUB2[i][j] = SUB2[i + 1][j]

subcase2) **SUB[i + 1][j] < SUB[i + 1][j + 1]**์ธ ๊ฒฝ์šฐ,

์šฐ์ธก ์•„๋ž˜ ์žˆ๋Š” ์›์†Œ๋ฅผ ์ด์šฉํ•ด์•ผ๋งŒ ์ตœ๋Œ€์˜ ๊ฒฝ๋กœ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ SUB2[i][j] = SUB2[i + 1][j + 1]

subcase3) **SUB[i + 1][j] == SUB[i + 1][j + 1]**์ธ ๊ฒฝ์šฐ,

๋ฐ”๋กœ ์•„๋ž˜, ์šฐ์ธก ์•„๋ž˜ ์žˆ๋Š” ์›์†Œ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋„ ํ•ญ์ƒ ์ตœ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ SUB2[i][j] = SUB2[i + 1][j] +SUB2[i + 1][j + 1].


// solve.
for (int h = N - 2; h >= 0; --h)
{
    for (int pos = 0; pos < h + 1; ++pos)
    {
        if (PATHSUM[h + 1][pos] > PATHSUM[h + 1][pos + 1])
        {
            PATHSUM[h][pos] = TRIANGLE[h][pos] + PATHSUM[h + 1][pos];
            PATHCNT[h][pos] = PATHCNT[h + 1][pos];
        }
        else if (PATHSUM[h + 1][pos] < PATHSUM[h + 1][pos + 1])
        {
            PATHSUM[h][pos] = TRIANGLE[h][pos] + PATHSUM[h + 1][pos + 1];
            PATHCNT[h][pos] = PATHCNT[h + 1][pos + 1];
        }
        else
        {
            PATHSUM[h][pos] = TRIANGLE[h][pos] + PATHSUM[h + 1][pos];
            PATHCNT[h][pos] = PATHCNT[h + 1][pos] + PATHCNT[h + 1][pos + 1];
        }
    }
}



###๋ฌธ์ œID : SNAIL(AOJ_SNAIL.cpp)

2017.02.27.(์›”).

์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ณ”์— ์†ํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋ถ€๋ถ„๋ฌธ์ œ๋งŒ ์ž˜ ์ •์˜ํ•ด์ฃผ๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„๋ฌธ์ œ์˜ ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

SUB[i][j] := i์ผ์— ๋‹ฌํŒฝ์ด๊ฐ€ j ๋ฏธํ„ฐ ์ด์ƒ์— ๋„๋‹ฌํ–ˆ์„ ํ™•๋ฅ 

์œ„์˜ ๋ถ€๋ถ„๋ฌธ์ œ ์ •์˜์— ๋งž์ถ”์–ด ๊ธฐ์ €์‚ฌ๋ก€์™€ ์žฌ๊ท€์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ ํ™”์‹์„ ์„ธ์šฐ๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

base case 1) j == 0์ธ ๊ฒฝ์šฐ,

ํ•ญ์ƒ 0 ๋ฏธํ„ฐ์—๋Š” ๋„๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ SUB[i][j] = 1.0

base case 2) j == 1์ด๊ณ  i != 0์ธ ๊ฒฝ์šฐ,

๋น„๊ฐ€ ์˜ค๊ฑด ์•ˆ์˜ค๊ฑด ์ƒ๊ด€ ์—†์ด i > 0์ผ ๋งŒ์— 1๋ฏธํ„ฐ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ SUB[i][j] = 1.0

base case 3) j != 0 ์ด๊ณ  i == 0์ธ ๊ฒฝ์šฐ,

0์ผ ๋งŒ์— j > 0 ๋ฏธํ„ฐ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ๋ฏ€๋กœ SUB[i][j] = 0.0

recursive step)

i์ผ ๋งŒ์— j๋ฏธํ„ฐ ์ด์ƒ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๋Š” 'i - 1์ผ์— ์ •ํ™•ํžˆ j - 1๋ฏธํ„ฐ ์ด์ƒ์— ๋„๋‹ฌํ•˜๊ณ  ๋น„๊ฐ€ ์˜ค๊ฑฐ๋‚˜ ์˜ค์ง€ ์•Š์€ ๊ฒฝ์šฐ', 'i - 1์ผ์— ์ •ํ™•ํžˆ j - 2๋ฏธํ„ฐ์— ๋„๋‹ฌํ•˜๊ณ  ๋น„๊ฐ€ ์˜จ ๊ฒฝ์šฐ'๋กœ ๋‚˜๋ˆ„์–ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์‹์€ ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๋ณด์ธ๋‹ค. ์ „์ž์˜ ๊ฒฝ์šฐ 'j - 1๋ฏธํ„ฐ ์ด์ƒ'์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ํ›„์ž์˜ ๊ฒฝ์šฐ '์ •ํ™•ํžˆ j - 2๋ฏธํ„ฐ'๋กœ ๋ฐ”๊พธ์–ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์ด์œ ๋Š” ๊ฐ ๋ถ€๋ถ„๋ฌธ์ œ๊ฐ€ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์„ ํฌํ•จํ•˜์ง€ ์•Š๋„๋กํ•˜๋”” ์œ„ํ•จ์ž„์— ์ฃผ์˜ํ•œ๋‹ค.

SUB[i][j] = SUB[i - 1][j - 1] + 0.75 * (SUB[i - 1][j - 2] - SUB[i - 1][j - 1])


for (int day = 1; day <= DAY; ++day)
{
    for (int h = 2; h <= H; ++h)
    {
        CACHE[day][h] = 0.25 * CACHE[day - 1][h - 1] + 0.75 * CACHE[day - 1][h - 2];
    }
}


###๋ฌธ์ œID : ASYMTILING(AOJ_ASYMTILING.cpp)

2017.02.28.(์›”).

์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋‹ค๋ฃจ๋Š” TILING2๋ฌธ์ œ์™€ ํฌ๊ฒŒ ๋‹ค๋ฅธ ์ ์€ ์—†๋‹ค. ๋‹จ์ง€, TILING2 ๋ฌธ์ œ๋ฅผ ํ’€์–ด์ค€ ํ›„์— ๋ถ€๋ถ„๋ฌธ์ œ๋“ค์„ ๊ฐ€์ง€๊ณ  ๋Œ€์นญ ํƒ€์ผ๋ง์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋นผ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋งŒ์ด ๋‹ค๋ฅด๋‹ค. 2 * n(n > 4) ๋„ˆ๋น„์˜ ์‚ฌ๊ฐํ˜•์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ ๋น„๋Œ€์นญ ํƒ€์ผ๋ง์˜ ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ๋ธŒ ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆ„์–ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ œํ•˜์—ฌ ์คŒ์œผ๋กœ์จ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ๋‹ค.

case 1 ) n ์ด ์ง์ˆ˜์ธ ๊ฒฝ์šฐ

tile

case 2 ) n ์ด ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ

tile


u64t ans = 0;

if (1 == N)
    ans = 0;
else if (2 == N)
    ans = 0;
else if (3 == N)
    ans = 2;
else if (4 == N)
    ans = 2;
else if (0 == N % 2)
{
    ans += fibo(N);
    ans += 2 * MOD;
    ans -= 2 * fibo((N - 2) / 2);
    ans %= MOD;
    ans += MOD;
    ans -= fibo((N - 4) / 2);
    ans %= MOD;
}
else
{
    ans += fibo(N);
    ans += MOD;
    ans -= fibo((N - 1) / 2);
    ans %= MOD;
}


###๋ฌธ์ œID : POLY(AOJ_POLY.cpp)

2017.03.02.(๋ชฉ).

์ ํ™”์‹์„ ๊ตฌํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ์€ ๊นŒ๋‹ค๋กญ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด์ง€๋งŒ, ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ์˜๋ฆฌํ•˜๊ฒŒ ์ •์˜ํ•˜๋ฉด ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค. n๊ฐœ์˜ ์ •์‚ฌ์ž‘ํ˜•์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ๊ฐ์˜ ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ฅผ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๋Š” ์ •์‚ฌ๊ฐํ˜•์˜ ๊ฐฏ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, n์ด 2์ธ ๊ฒฝ์šฐ, 3์ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

poly

n = 3์ธ ๊ฒฝ์šฐ๋ฅผ ์ž˜ ์‚ดํŽด๋ณด๋ฉด, 3๊ฐœ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์ƒ๋‹จ์— **top(1 <= top <= 2)**๊ฐœ ์ •์‚ฌ๊ฐํ˜•์ด ์กด์žฌํ•˜๋Š” ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋Š” 3 - top๊ฐœ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์ƒ๋‹จ์— **under(1 <= under <= 3 - top)**๊ฐœ ์ •์‚ฌ๊ฐํ˜•์ด ์œ„์น˜ํ•˜๋Š” ํด๋ฆฌ์˜ค๋ฏธ๋…ธ ์ƒ๋‹จ์— top๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์„ ์˜ฌ๋ ค๋†“๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค(์ ์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•œ ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด). ์—ฌ๊ธฐ์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์ตœ์ƒ๋‹จ์— 3๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์ด ์œ„์น˜ํ•˜๋Š” ์ผ์ง์„  ๋ชจ์–‘์˜ ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ฅผ ๋”ํ•ด์ค€๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” 3๊ฐœ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ณผ์ •์„ ์ˆ˜์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•˜์ž.

SUB[total][top] := total๊ฐœ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์ƒ๋‹จ์— top๊ฐœ ์ •์‚ฌ๊ฐํ˜•์ด ์œ„์น˜ํ•˜๋Š” ํด๋ฆฌ์˜ค๋ฏธ๋…ธ์˜ ์ˆ˜

์œ„์˜ ๋ถ€๋ถ„๋ฌธ์ œ์— ๋”ฐ๋ผ ๊ธฐ์ €์‚ฌ๋ก€์™€ ์žฌ๊ท€์‚ฌ๋ก€๋ฅผ ์ •์˜ํ•ด์ฃผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

base case 1) total < top์ธ ๊ฒฝ์šฐ.

์ด ์ •์‚ฌ๊ฐํ˜•์˜ ์ˆ˜๋ณด๋‹ค ๋งŽ์€ ์ˆ˜์˜ ์ •์‚ฌ๊ฐํ˜•์ด ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•  ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ SUB[total][top] = 0.

base case 2) total == top์ธ ๊ฒฝ์šฐ,

total๊ฐœ ์ •์‚ฌ๊ฐํ˜•์„ ์‚ฌ์šฉํ•  ๋•Œ, ์ตœ์ƒ๋‹จ์— total๊ฐœ ์ •์‚ฌ๊ฐํ˜•์ด ์œ„์น˜ํ•˜๋Š” ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋Š” ์ผ์ง์„  ๋ชจ์–‘์˜ ํด๋ฆฌ์˜ค๋ฏธ๋…ธ ๋ฟ์ด๋‹ค. ๋”ฐ๋ผ์„œ, SUB[total][top] = 1.

recursive step) total > top์ธ ๊ฒฝ์šฐ,

top๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์„ total - top๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์ตœ์ƒ๋‹จ์— under๊ฐœ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ํด๋ฆฌ์˜ค๋ฏธ๋…ธ์˜ ์œ„์— ์˜ฌ๋ ค ๋†“์œผ๋ฉด ๋œ๋‹ค. top๊ฐœ ์ •์‚ฌ๊ฐํ˜•์„ under๊ฐœ ์ •์‚ฌ๊ฐํ˜• ์œ„์— ์˜ฌ๋ ค๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋Š” top + under - 1๊ฐœ ์ด๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์‹์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

SUB[total][top] = sum{(top + under - 1) * SUB[total - top][under]}, 1 <= under < top

๋น ๋ฅธ ํ’€์ด๋ฅผ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ตœ๋Œ€ ํฌ๊ธฐ์— ๋Œ€ํ•ด ๋ชจ๋“  ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ๋‹ค ํ’€์–ด ๋†“์€ ๋’ค ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ SUB[total][0] + SUB[total][1] + ... + SUB[total][total]์„ ๊ตฌํ•ด์ค€๋‹ค๋ฉด ์ข€ ๋” ํšจ์œจ์ ์ธ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


// pre-processing.
for (int total = 1; total <= MAXN; ++total)
{
    for (int top = 1; top < total; ++top)
    {
        CACHE[total][top] = 0;
        for (int under = 1; under <= total - top; ++under)
        {
            CACHE[total][top] += (top + under - 1) * CACHE[total - top][under];
            CACHE[total][top] %= MOD;
        }
    }
    CACHE[total][total] = 1;
}

// solve.
scanf(" %d", &N);
int ans = 0;
for (int top = 1; top <= N; ++top)
    ans = (ans + CACHE[N][top]) % MOD;


About

AOJ solutions

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages