Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 수학
- 누적 합
- c++
- 백트래킹
- XR Interaction Toolkit
- 백준
- 정렬
- 재귀
- 우선순위 큐
- 유니온 파인드
- 그리디 알고리즘
- 스택
- 브루트포스
- 투 포인터
- 그래프
- 알고리즘
- 시뮬레이션
- 자료구조
- 트리
- 구현
- DFS
- VR
- 다이나믹 프로그래밍
- ue5
- 다익스트라
- BFS
- 문자열
- Team Fortress 2
- 유니티
- Unreal Engine 5
Archives
- Today
- Total
1일1알
백준 11568번 민균이의 계략 C++ 본문
문제를 한줄로 요약하자면 가장 긴 증가하는 부분 수열을 구하는 것이다.
다이나믹 프로그래밍으로 해결할 수 있는 문제이다.
처음에 수열의 길이를 저장하는 dp테이블을 모두 1로 초기화 시킨다. (자신만 있을 경우 수열의 길이는 1)
원소들을 처음부터 검사하면서 자신의 앞에 있는 모든 원소들을 비교하다가 만약 자신보다 값이 작은 값을 찾으면 자신이 그 수열에 포함된다면 증가하는 수열의 길이가 늘어나는 것이기 때문에 찾은 값의 수열의 길이 중 가장 큰 값을 저장한다.
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<int> v(n);
vector<int> dp(n, 1);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
dp[0] = 1;
int ans = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (v[i] > v[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(ans, dp[i]);
}
cout << ans;
};
'알고리즘' 카테고리의 다른 글
백준 15662번 톱니바퀴 (2) C++ (0) | 2021.12.06 |
---|---|
백준 2002번 추월 C++ (0) | 2021.12.05 |
백준 1342번 행운의 문자열 C++ (0) | 2021.12.03 |
백준 2410번 2의 멱수의 합 C++ (0) | 2021.12.02 |
백준 15900번 나무 탈출 C++ (0) | 2021.12.01 |