From 884eb1e0c739fad9d949e4c97f7d1fc86034f4ff Mon Sep 17 00:00:00 2001 From: "Zyad M. Ayad" <36793243+Zyad-Ayad@users.noreply.github.com> Date: Wed, 24 Apr 2024 15:02:23 +0200 Subject: [PATCH 1/6] Update intro-to-dp.md --- src/dynamic_programming/intro-to-dp.md | 59 ++++++++++++++++++++------ 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/src/dynamic_programming/intro-to-dp.md b/src/dynamic_programming/intro-to-dp.md index 0102581fa..dbced6187 100644 --- a/src/dynamic_programming/intro-to-dp.md +++ b/src/dynamic_programming/intro-to-dp.md @@ -130,19 +130,48 @@ That's it. That's the basics of dynamic programming: Don't repeat work you've do One of the tricks to getting better at dynamic programming is to study some of the classic examples. ## Classic Dynamic Programming Problems -- 0-1 Knapsack -- Subset Sum -- Longest Increasing Subsequence -- Counting all possible paths from top left to bottom right corner of a matrix -- Longest Common Subsequence -- Longest Path in a Directed Acyclic Graph (DAG) -- Coin Change -- Longest Palindromic Subsequence -- Rod Cutting -- Edit Distance -- Bitmask Dynamic Programming -- Digit Dynamic Programming -- Dynamic Programming on Trees +
+
0-1 Knapsack
+
given a set of items, each with a weight and a value, and a knapsack with a maximum capacity.
+ +
Subset Sum
+
you are given a set of integers and a target sum. The task is to determine whether there exists a subset of the given set whose elements sum up to the target sum.
+ +
Longest Increasing Subsequence
+
It's a problem that asks for the length of the longest subsequence of a given sequence such that all elements of the subsequence are sorted in increasing order.
+ +
Counting all possible paths from top left to bottom right corner of a matrix
+
solved using dynamic programming or recursion with memoization.
+ +
Longest Common Subsequence
+
Given two sequences (usually strings), the task is to find the length of the longest subsequence that is common to both sequences.
+ +
Longest Path in a Directed Acyclic Graph (DAG)
+
Unlike finding the longest path in a general graph, which is an NP-hard problem, finding the longest path in a DAG can be solved efficiently using dynamic programming.
+ +
Longest Palindromic Subsequence
+
Finding the Longest Palindromic Subsequence (LPS) of a given string.
+ +
Rod Cutting
+
It involves finding the maximum revenue that can be obtained by cutting a rod of length n into smaller pieces and selling them.
+ +
Edit Distance
+
It involves finding the minimum number of operations required to transform one string into another, where the allowed operations are insertion, deletion, or substitution of a single character.
+ +
Bitmask Dynamic Programming
+
Bitmask Dynamic Programming is a technique used to solve combinatorial optimization problems, where the state can be represented compactly using bitmasks.
+ +
Digit Dynamic Programming
+
Digit Dynamic Programming is a technique used to solve problems related to digits of a number.
+ +
Dynamic Programming on Trees
+
a technique used to solve various problems related to trees, such as finding the longest path, computing subtree properties, or counting certain structures within the tree.
+ +
Range Dynamic Programming
+
FinRange Dynamic Programming is a technique used to solve problems where you need to find optimal solutions for subranges within a given range or array.
+ + +
Of course, the most important trick is to practice. @@ -151,3 +180,7 @@ Of course, the most important trick is to practice. * [LeetCode - 118. Pascal's Triangle](https://leetcode.com/problems/pascals-triangle/description/) * [LeetCode - 1025. Divisor Game](https://leetcode.com/problems/divisor-game/description/) +## Dp Contests +* [Atcoder - Educational DP Contest](https://atcoder.jp/contests/dp/tasks) +* [CSES - Dynamic Programming](https://cses.fi/problemset/list/) + From 6c693ede87af4e072572c6999c17f7b82ca0703c Mon Sep 17 00:00:00 2001 From: "Zyad M. Ayad" <36793243+Zyad-Ayad@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:04:49 +0200 Subject: [PATCH 2/6] Update intro-to-dp.md --- src/dynamic_programming/intro-to-dp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynamic_programming/intro-to-dp.md b/src/dynamic_programming/intro-to-dp.md index dbced6187..2aa2b791a 100644 --- a/src/dynamic_programming/intro-to-dp.md +++ b/src/dynamic_programming/intro-to-dp.md @@ -168,7 +168,7 @@ One of the tricks to getting better at dynamic programming is to study some of t
a technique used to solve various problems related to trees, such as finding the longest path, computing subtree properties, or counting certain structures within the tree.
Range Dynamic Programming
-
FinRange Dynamic Programming is a technique used to solve problems where you need to find optimal solutions for subranges within a given range or array.
+
Range Dynamic Programming is a technique used to solve problems where you need to find optimal solutions for subranges within a given range or array.
From 762f0766719af2ae3d5179377c31bb4fb791d4b0 Mon Sep 17 00:00:00 2001 From: "Zyad M. Ayad" <36793243+Zyad-Ayad@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:40:21 +0200 Subject: [PATCH 3/6] Update intro-to-dp.md Added links to standard problems. --- src/dynamic_programming/intro-to-dp.md | 58 +++++++------------------- 1 file changed, 16 insertions(+), 42 deletions(-) diff --git a/src/dynamic_programming/intro-to-dp.md b/src/dynamic_programming/intro-to-dp.md index 2aa2b791a..21b629cd5 100644 --- a/src/dynamic_programming/intro-to-dp.md +++ b/src/dynamic_programming/intro-to-dp.md @@ -130,48 +130,22 @@ That's it. That's the basics of dynamic programming: Don't repeat work you've do One of the tricks to getting better at dynamic programming is to study some of the classic examples. ## Classic Dynamic Programming Problems -
-
0-1 Knapsack
-
given a set of items, each with a weight and a value, and a knapsack with a maximum capacity.
- -
Subset Sum
-
you are given a set of integers and a target sum. The task is to determine whether there exists a subset of the given set whose elements sum up to the target sum.
- -
Longest Increasing Subsequence
-
It's a problem that asks for the length of the longest subsequence of a given sequence such that all elements of the subsequence are sorted in increasing order.
- -
Counting all possible paths from top left to bottom right corner of a matrix
-
solved using dynamic programming or recursion with memoization.
- -
Longest Common Subsequence
-
Given two sequences (usually strings), the task is to find the length of the longest subsequence that is common to both sequences.
- -
Longest Path in a Directed Acyclic Graph (DAG)
-
Unlike finding the longest path in a general graph, which is an NP-hard problem, finding the longest path in a DAG can be solved efficiently using dynamic programming.
- -
Longest Palindromic Subsequence
-
Finding the Longest Palindromic Subsequence (LPS) of a given string.
- -
Rod Cutting
-
It involves finding the maximum revenue that can be obtained by cutting a rod of length n into smaller pieces and selling them.
- -
Edit Distance
-
It involves finding the minimum number of operations required to transform one string into another, where the allowed operations are insertion, deletion, or substitution of a single character.
- -
Bitmask Dynamic Programming
-
Bitmask Dynamic Programming is a technique used to solve combinatorial optimization problems, where the state can be represented compactly using bitmasks.
- -
Digit Dynamic Programming
-
Digit Dynamic Programming is a technique used to solve problems related to digits of a number.
- -
Dynamic Programming on Trees
-
a technique used to solve various problems related to trees, such as finding the longest path, computing subtree properties, or counting certain structures within the tree.
- -
Range Dynamic Programming
-
Range Dynamic Programming is a technique used to solve problems where you need to find optimal solutions for subranges within a given range or array.
- - -
+| Name | Description | Example Poblems | +| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| 0-1 Knapsack | 0-1 Knapsack | given a set of items, each with a weight and a value, and a knapsack with a maximum capacity. | [D - Knapsack 1 (](https://atcoder.jp/contests/dp/tasks/dp_d)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_d) | +| 0-1 Knapsack | +| Subset Sum | you are given a set of integers and a target sum. The task is to determine whether there exists a subset of the given set whose elements sum up to the target sum. | | +| Longest Increasing Subsequence | It's a problem that asks for the length of the longest subsequence of a given sequence such that all elements of the subsequence are sorted in increasing order. | [Longest Increasing Subsequence - LeetCode](https://leetcode.com/problems/longest-increasing-subsequence/description/) | +| Counting all possible paths in a matrix. | Solved using dynamic programming or recursion with memoization. | [Unique Paths - LeetCode](https://leetcode.com/problems/unique-paths/description/) | +| Longest Common Subsequence | Given two sequences (usually strings), the task is to find the length of the longest subsequence that is common to both sequences. | [F - LCS (](https://atcoder.jp/contests/dp/tasks/dp_f)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_f) | +| Longest Path in a Directed Acyclic Graph (DAG) | Unlike finding the longest path in a general graph, which is an NP-hard problem, finding the longest path in a DAG can be solved efficiently using dynamic programming. | [G - Longest Path (](https://atcoder.jp/contests/dp/tasks/dp_g)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_g) | +| Longest Palindromic Subsequence | Finding the Longest Palindromic Subsequence (LPS) of a given string. | [Longest Palindromic Subsequence - LeetCode](https://leetcode.com/problems/longest-palindromic-subsequence/description/) | +| Rod Cutting | It involves finding the maximum revenue that can be obtained by cutting a rod of length n into smaller pieces and selling them. | | +| Edit Distance | It involves finding the minimum number of operations required to transform one string into another, where the allowed operations are insertion, deletion, or substitution of a single character. | [CSES - Edit Distance](https://cses.fi/problemset/task/1639) | +| Bitmask Dynamic Programming | Bitmask Dynamic Programming is a technique used to solve combinatorial optimization problems, where the state can be represented compactly using bitmasks. | [Problem - F - Codeforces](https://codeforces.com/contest/1043/problem/F) | +| Digit Dynamic Programming | Digit Dynamic Programming is a technique used to solve problems related to digits of a number. | [SPOJ.com](http://SPOJ.com) [- Problem PR003004](https://www.spoj.com/problems/PR003004/) | +| Dynamic Programming on Trees | A technique used to solve various problems related to trees, such as finding the longest path, computing subtree properties, or counting certain structures within the tree. | [P - Independent Set (](https://atcoder.jp/contests/dp/tasks/dp_p)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_p) | +| Range Dynamic Programming | Range Dynamic Programming is a technique used to solve problems where you need to find optimal solutions for subranges within a given range or array. | | Of course, the most important trick is to practice. From fa03985674436f18d4ff96644dcde401820bc0b4 Mon Sep 17 00:00:00 2001 From: "Zyad M. Ayad" <36793243+Zyad-Ayad@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:41:36 +0200 Subject: [PATCH 4/6] Update intro-to-dp.md --- src/dynamic_programming/intro-to-dp.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dynamic_programming/intro-to-dp.md b/src/dynamic_programming/intro-to-dp.md index 21b629cd5..eb3302a93 100644 --- a/src/dynamic_programming/intro-to-dp.md +++ b/src/dynamic_programming/intro-to-dp.md @@ -133,7 +133,6 @@ One of the tricks to getting better at dynamic programming is to study some of t | Name | Description | Example Poblems | | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | | 0-1 Knapsack | 0-1 Knapsack | given a set of items, each with a weight and a value, and a knapsack with a maximum capacity. | [D - Knapsack 1 (](https://atcoder.jp/contests/dp/tasks/dp_d)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_d) | -| 0-1 Knapsack | | Subset Sum | you are given a set of integers and a target sum. The task is to determine whether there exists a subset of the given set whose elements sum up to the target sum. | | | Longest Increasing Subsequence | It's a problem that asks for the length of the longest subsequence of a given sequence such that all elements of the subsequence are sorted in increasing order. | [Longest Increasing Subsequence - LeetCode](https://leetcode.com/problems/longest-increasing-subsequence/description/) | | Counting all possible paths in a matrix. | Solved using dynamic programming or recursion with memoization. | [Unique Paths - LeetCode](https://leetcode.com/problems/unique-paths/description/) | From 357286307241bcba160af5b2c9ac8a85135a6ca1 Mon Sep 17 00:00:00 2001 From: "Zyad M. Ayad" <36793243+Zyad-Ayad@users.noreply.github.com> Date: Thu, 25 Apr 2024 10:50:59 +0200 Subject: [PATCH 5/6] Update intro-to-dp.md - Problems descriptions/examples are short and uniform. - Added separate list for topic (BitmaskDP, DigitDP and DP on Trees) --- src/dynamic_programming/intro-to-dp.md | 31 +++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/dynamic_programming/intro-to-dp.md b/src/dynamic_programming/intro-to-dp.md index eb3302a93..06649670e 100644 --- a/src/dynamic_programming/intro-to-dp.md +++ b/src/dynamic_programming/intro-to-dp.md @@ -130,21 +130,22 @@ That's it. That's the basics of dynamic programming: Don't repeat work you've do One of the tricks to getting better at dynamic programming is to study some of the classic examples. ## Classic Dynamic Programming Problems -| Name | Description | Example Poblems | -| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| 0-1 Knapsack | 0-1 Knapsack | given a set of items, each with a weight and a value, and a knapsack with a maximum capacity. | [D - Knapsack 1 (](https://atcoder.jp/contests/dp/tasks/dp_d)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_d) | -| Subset Sum | you are given a set of integers and a target sum. The task is to determine whether there exists a subset of the given set whose elements sum up to the target sum. | | -| Longest Increasing Subsequence | It's a problem that asks for the length of the longest subsequence of a given sequence such that all elements of the subsequence are sorted in increasing order. | [Longest Increasing Subsequence - LeetCode](https://leetcode.com/problems/longest-increasing-subsequence/description/) | -| Counting all possible paths in a matrix. | Solved using dynamic programming or recursion with memoization. | [Unique Paths - LeetCode](https://leetcode.com/problems/unique-paths/description/) | -| Longest Common Subsequence | Given two sequences (usually strings), the task is to find the length of the longest subsequence that is common to both sequences. | [F - LCS (](https://atcoder.jp/contests/dp/tasks/dp_f)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_f) | -| Longest Path in a Directed Acyclic Graph (DAG) | Unlike finding the longest path in a general graph, which is an NP-hard problem, finding the longest path in a DAG can be solved efficiently using dynamic programming. | [G - Longest Path (](https://atcoder.jp/contests/dp/tasks/dp_g)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_g) | -| Longest Palindromic Subsequence | Finding the Longest Palindromic Subsequence (LPS) of a given string. | [Longest Palindromic Subsequence - LeetCode](https://leetcode.com/problems/longest-palindromic-subsequence/description/) | -| Rod Cutting | It involves finding the maximum revenue that can be obtained by cutting a rod of length n into smaller pieces and selling them. | | -| Edit Distance | It involves finding the minimum number of operations required to transform one string into another, where the allowed operations are insertion, deletion, or substitution of a single character. | [CSES - Edit Distance](https://cses.fi/problemset/task/1639) | -| Bitmask Dynamic Programming | Bitmask Dynamic Programming is a technique used to solve combinatorial optimization problems, where the state can be represented compactly using bitmasks. | [Problem - F - Codeforces](https://codeforces.com/contest/1043/problem/F) | -| Digit Dynamic Programming | Digit Dynamic Programming is a technique used to solve problems related to digits of a number. | [SPOJ.com](http://SPOJ.com) [- Problem PR003004](https://www.spoj.com/problems/PR003004/) | -| Dynamic Programming on Trees | A technique used to solve various problems related to trees, such as finding the longest path, computing subtree properties, or counting certain structures within the tree. | [P - Independent Set (](https://atcoder.jp/contests/dp/tasks/dp_p)[atcoder.jp](http://atcoder.jp)[)](https://atcoder.jp/contests/dp/tasks/dp_p) | -| Range Dynamic Programming | Range Dynamic Programming is a technique used to solve problems where you need to find optimal solutions for subranges within a given range or array. | | +| Name | Description/Example | +| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 0-1 knapsack | Given $W$, $N$, and $N$ items with weights $w_i$ and values $v_i$, what is the maximum $\sum_{i=1}^{k} v_i$ for each subset of items of size $k$ ($1 \le k \le N$) while ensuring $\sum_{i=1}^{k} w_i \le W$? | +| Subset Sum | Given $N$ integers and $T$, determine whether there exists a subset of the given set whose elements sum up to the $T$. | +| Longest Increasing Subsequence | You are given an array containing $N$ integers. Your task is to determine the LCS in the array, i.e., LCS where every element is larger than the previous one. | +| Counting all possible paths in a matrix. | Given $N$ and $M$, count all possible distinct paths from $(1,1)$ to $(N, M)$, where each step is either from $(i,j)$ to $(i+1,j)$ or $(i,j+1)$. | +| Longest Common Subsequence | You are given strings $s$ and $t$. Find the length of the longest string that is a subsequence of both $s$ and $t$. | +| Longest Path in a Directed Acyclic Graph (DAG) | Finding the longest path in Directed Acyclic Graph (DAG). | +| Longest Palindromic Subsequence | Finding the Longest Palindromic Subsequence (LPS) of a given string. | +| Rod Cutting | Given a rod of length $n$ units, Given an integer array cuts where cuts[i] denotes a position you should perform a cut at. The cost of one cut is the length of the rod to be cut. What is the minimum total cost of the cuts. | +| Edit Distance | The edit distance between two strings is the minimum number of operations required to transform one string into the other. Operations are ["Add", "Remove", "Replace"] | + +## Related Topics +* Bitmask Dynamic Programming +* Digit Dynamic Programming +* Dynamic Programming on Trees Of course, the most important trick is to practice. From ff4b38046067c1e90975db144af8cd303c69ce21 Mon Sep 17 00:00:00 2001 From: Oleksandr Kulkov Date: Sun, 9 Jun 2024 02:06:32 +0200 Subject: [PATCH 6/6] Touch for CI pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy