https://www.acmicpc.net/problem/9251
🧩 DP = 완전탐색(Brute Force) + 메모이제이션(Memoization)
1️⃣ 완전탐색처럼 모든 경우의 수를 생각 🤯
2️⃣ 그 구조를 만들면서 점화식(Recurrence Relation)을 유도 🔄
3️⃣ 계산된 값을 저장하여 중복 계산을 방지 (메모이제이션) 💾
📂 이미 계산된 값을 저장하고 재사용하는 것!
📦 어디에 저장할까?
✅ array (배열)
✅ map (해시맵)
✅ set (중복 방지)
🔼 Top-Down (재귀, 직관적) 🛠
🔽 Bottom-Up (반복, 효율적) ⚡
방법 설명 장점 단점
🔼 Top-Down | 재귀 기반 DP | 코드가 직관적 | 함수 호출이 많아 속도 저하 가능 |
🔽 Bottom-Up | 반복문 기반 DP | 속도가 빠름 | DP 테이블을 미리 만들어야 함 |
📢 DP를 이해하는 가장 쉬운 방법:
👉 완전탐색처럼 풀고, 중복 계산을 방지하는 것! 💡
#include <iostream>
#include<vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
string str1, str2;
cin >> str1;
cin >> str2;
int strSize = str1.size();
int strSize2 = str2.size();
//DP 초기화
vector<vector<int>> DP(strSize + 1, vector<int>(strSize2 + 1, 0));
for (int i = 1; i <= strSize; i++)
{
for (int j = 1; j <= strSize2; j++)
{
if (str1[i - 1] == str2[j - 1])
{
DP[i][j] = DP[i - 1][j - 1] + 1;
}
else
{
DP[i][j] = max(DP[i - 1][j], DP[i][j - 1]);
}
}
}
cout << DP[strSize][strSize2] << "\n";
return 0;
}
외판원 문제 (TSP, Traveling Salesman Problem) (0) | 2025.02.22 |
---|---|
BJ 2225 합분해 (0) | 2025.02.20 |
백준 11053 가장 긴 증가하는 부분 수열 LIS+DP (0) | 2025.02.18 |
백준 11399 그리디 알고리즘 (0) | 2025.02.11 |
백준 27961 마도카 고양이 (0) | 2025.02.11 |