Selamat datang di Course DSA - Data Structures and Algorithms. Pelajari struktur data dan algoritma dari fondasi hingga topik lanjutan, dengan implementasi C++ modern, analisis kompleksitas, dan strategi pemecahan masalah untuk competitive programming maupun wawancara teknis. Course ini disusun secara bertahap dari konsep dasar struktur data dan algoritma, dilanjutkan dengan fondasi C++ modern, analisis kompleksitas, hingga topik lanjutan seperti dynamic programming, graph algorithms, dan competitive programming.

Setiap Chapter berisi penjelasan konsep disertai contoh kode C++ yang dapat dikompilasi dan dijalankan secara langsung. Kode dianalisis baris-per-baris agar pembaca memahami mekanisme di baliknya, bukan sekadar menyalin hasil.

Peta Materi #

  • Bagian 1 — Pengenalan & Fondasi (Section 1–5): konsep DSA, persiapan C++, fondasi C++, analisis kompleksitas, dan pembuktian algoritma.
  • Bagian 2 — Struktur Data (Section 6–14): array, linked list, stack, queue, hashing, tree, dan heap.
  • Bagian 3 — Algoritma Inti (Section 10–13, 16–19): searching, sorting, rekursi, graph algorithms, greedy, DP, dan string algorithms.
  • Bagian 4 — Teknik & Lanjutan (Section 20–26): teknik pemecahan masalah, matematika, struktur data lanjutan, STL, dan pengujian.
  • Bagian 5 — Aplikasi (Section 27–30): competitive programming, penerapan dunia nyata, strategi belajar, dan proyek terapan.

Bab 18 Dynamic Programming

# Konsep Dynamic Programming

Definisi DP: optimal substructure dan overlapping subproblems.

Buka →
# Memoization

DP top-down: simpan hasil sub-masalah di cache untuk menghindari recomputation.

Buka →
# Tabulation

DP bottom-up: bangun tabel secara iteratif dari sub-masalah terkecil.

Buka →
# Menentukan State DP

Cara merancang state DP: parameter yang dibutuhkan untuk mengambil keputusan.

Buka →
# Menentukan Transisi DP

Cara menulis recurrence: pilihan apa yang tersedia di setiap state?

Buka →
# Fibonacci dan DP Dasar

Progresi dari rekursi naif O(2^n) ke memo O(n) ke tabulation O(n) ke space-optimized O(1).

Buka →
# Climbing Stairs

DP 1D paling klasik: jumlah cara naik tangga dengan langkah 1 atau 2.

Buka →
# Coin Change

DP klasik: jumlah minimum koin atau jumlah cara untuk membentuk nilai tertentu.

Buka →
# Knapsack

0/1 knapsack: maximasi nilai dengan batasan kapasitas. DP 2D dan optimasi ruang 1D.

Buka →
# Longest Common Subsequence (LCS)

DP 2D klasik: subsequence terpanjang yang sama pada dua string, plus rekonstruksi.

Buka →
# Longest Increasing Subsequence (LIS)

DP O(n²) dan optimasi O(n log n) dengan patience sorting.

Buka →
# Edit Distance

DP 2D: jumlah minimum operasi insert, delete, replace untuk mengubah satu string ke string lain.

Buka →
# Interval DP

DP pada interval [i, j] dengan mencoba semua titik potong k. Contoh: matrix chain multiplication.

Buka →
# Tree DP

DP pada pohon: post-order traversal, dp[u] sebagai fungsi dp[v] anak-anaknya.

Buka →
# Bitmask DP

DP dengan state bitmask untuk himpunan kecil (n ≤ 20). Contoh klasik: TSP.

Buka →
# Optimasi Dynamic Programming

Teknik lanjutan: divide and conquer optimization, convex hull trick, monotone queue, Knuth optimization.

Buka →