[TIL] 130 [C#] ๋ฐฐ๋‚ญ, DP

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: ,


๋ฐฐ๋‚ญ DP



๋ฐฐ๋‚ญ๋ฌธ์ œ

๋ฌธ์ œ ์˜ˆ์‹œ
๋ฐฐ๋‚ญ์— ๋ฌผ๊ฑด์„ ๋„ฃ์„ ๋•Œ ๋ฐฐ๋‚ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ(k), ๋กœ ์ตœ๋Œ€๊ฐ€์น˜๋กœ ๋ฌผ๊ฑด(n)๊ฐœ ๋ฐฐ๋‚ญ์— ๋‹ด๊ธฐ.



์˜ˆ์‹œ

int[n,k] dp
1 ~ n๋ฒˆ์งธ ๋ฌผ๊ฑด์„ k์ดํ•˜๋กœ ๋‹ด์„ ๋•Œ ์ตœ๋Œ€์˜ ๊ฐ€์น˜ = dp[n,k]

/* ์ž…๋ ฅ
4 7     // (n, k)
6 13    // (k, value) - 1๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ์ •๋ณด
4 8     // 2๋ฒˆ์งธ 
3 6     // 3
5 12    // 4
*/

class Program
{
    static void Main()
    {
        {
            var sw = new StreamWriter(Console.OpenStandardOutput());

            //int T = Convert.ToInt32(Console.ReadLine());
            int[] inputArr = Array.ConvertAll(Console.ReadLine().Split(" "), Convert.ToInt32);
            int n = inputArr[0];
            int k = inputArr[1];

            var objs = new (int k , int v)[n+1];    // ํŠœํ”Œ๋กœ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ,๊ฐ€์น˜ ์ €์žฅ
            int[,] dp = new int[n + 1, k + 1];

            for (int i = 1; i <= n; i++)
            {
                int[] obj = Array.ConvertAll(Console.ReadLine().Split(" "), Convert.ToInt32);
                objs[i].k = obj[0];
                objs[i].v = obj[1];
            }

            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= k; j++)
                {
                    if (objs[i].k <= j) // dp[i,j] 1 ~ i ๋ฒˆ์งธ ๋ฌผ๊ฑด์„ j์ดํ•˜๋กœ ๋‹ด์„ ๋•Œ ์ตœ๋Œ€์˜ ๊ฐ€์น˜ = dp[i,j]  
                    {
                        dp[i, j] = Math.Max(dp[i - 1, j], dp[i - 1, j - objs[i].k] + objs[i].v);
                        // dp[i,j] => 
                        // ์ด์ „ ๋ฌผ๊ฑด๊นŒ์ง€ ๊ฐ€์น˜ 
                        // (์ด์ „ ๋ฌผ๊ฑด๊นŒ์ง€์˜ ๋ฌด๊ฒŒ + ํ˜„์žฌ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ) ๊ฐ€ ๋ฐฐ๋‚ญ ์ค‘๋Ÿ‰(j) ๋ณด๋‹ค ์ž‘์„ ๋•Œ ์˜ ๊ฐ€์น˜
                        // ๋‘˜์ค‘ ํฐ๊ฐ’.
                    }
                    else
                    {
                        dp[i, j] = dp[i - 1, j];
                    }
                }
            }

            sw.WriteLine($"{dp[n,k]}");
            sw.Flush(); sw.Close();
        }
    }
}

DP
image



3. ๋ฐฐ๋‚ญ ๋‹ด๊ธฐ DP

for (int i = 1; i <= n; i++)
{
    for (int j = 1; j <= k; j++)
    {
        if (objs[i].k <= j) // dp[i,j] 1 ~ i ๋ฒˆ์งธ ๋ฌผ๊ฑด์„ j์ดํ•˜๋กœ ๋‹ด์„ ๋•Œ ์ตœ๋Œ€์˜ ๊ฐ€์น˜ = dp[i,j]  
        {
            dp[i, j] = Math.Max(dp[i - 1, j], dp[i - 1, j - objs[i].k] + objs[i].v);
            // dp[i,j] => 
            // ์ด์ „ ๋ฌผ๊ฑด๊นŒ์ง€ ๊ฐ€์น˜ 
            // (์ด์ „ ๋ฌผ๊ฑด๊นŒ์ง€์˜ ๋ฌด๊ฒŒ + ํ˜„์žฌ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ) ๊ฐ€ ๋ฐฐ๋‚ญ ์ค‘๋Ÿ‰(j) ๋ณด๋‹ค ์ž‘์„ ๋•Œ ์˜ ๊ฐ€์น˜
            // ๋‘˜์ค‘ ํฐ๊ฐ’.
        }
        else
        {
            dp[i, j] = dp[i - 1, j];
        }
    }
}





์žก๋‹ด, ์ผ๊ธฐ?

๋ฐฐ๋‚ญ๋ฌธ์ œ dp




๐Ÿ“”

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ