codeplus 백준 강사 강의 내용기반으로 정리한 내용입니다.(비공개 포스트)
가장 긴 증가하는 부분 수열 문제
Longest Increasing Subsequence(LIS) 문제
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N = 0;
cin >> N;
vector<int> arr(N + 1, 0);
vector<int> dp(N + 1, 0);
for (int i = 0; i < N; ++i) {
cin >> arr[i];
}
for(int i=0; i<N; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (arr[j] < arr[i] && dp[j]+1 > dp[i]) {
dp[i] = dp[j] + 1;
}
}
}
int ans = 0;
for (int i = 0; i < N; ++i) {
if (ans < dp[i])
ans = dp[i];
}
cout << ans << '\n';
return 0;
}
가장 긴 증가하는 부분 수열4 문제
#include <iostream>
#include <vector>
using namespace std;
void go(int p, vector<int>& a, vector<int>& v) {
if (p == -1) {
return;
}
go(v[p], a, v);
cout << a[p] << ' ';
}
int main() {
int N = 0;
cin >> N;
vector<int> arr(N + 1, 0);
vector<int> dp(N + 1, 0);
vector<int> prev(N + 1, -1);
for (int i = 0; i < N; ++i) {
cin >> arr[i];
}
for (int i = 0; i<N; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (arr[j] < arr[i] && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
prev[i] = j;
}
}
}
int ans = 0;
int max_index = 0;
for (int i = 0; i < N; ++i) {
if (ans < dp[i]) {
ans = dp[i];
max_index = i;
}
}
cout << ans << '\n';
go(max_index, arr, prev);
cout << '\n';
return 0;
}
가장 큰 증가하는 부분 수열 문제
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N = 0;
cin >> N;
vector<int> arr(N + 1, 0);
vector<int> dp(N + 1, 0);
for (int i = 0; i < N; ++i) {
cin >> arr[i];
}
for (int i = 0; i<N; ++i) {
dp[i] = arr[i];
for (int j = 0; j < i; ++j) {
if (arr[j] < arr[i] && dp[j] + arr[i] > dp[i]) {
dp[i] = dp[j] + arr[i];
}
}
}
int ans = 0;
for (int i = 0; i < N; ++i) {
if (ans < dp[i])
ans = dp[i];
}
cout << ans << '\n';
return 0;
}
연속합 문제
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n = 0;
cin >> n;
vector<int> arr(n + 1, 0);
vector<int> dp(n + 1, 0);
for (int i = 0; i < n; ++i)
cin >> arr[i];
dp[0] = arr[0];
for (int i = 1; i < n; ++i) {
dp[i] = arr[i];
if (dp[i] < dp[i - 1] + arr[i]) {
dp[i] = dp[i - 1] + arr[i];
}
}
int ans = dp[0];
for (int i = 1; i < n; ++i) {
if (ans < dp[i])
ans = dp[i];
}
cout << ans << '\n';
return 0;
}
연속합2 문제
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n = 0;
cin >> n;
vector<int> a(n);
for (int i = 0; i<n; i++) {
cin >> a[i];
}
vector<int> d(n);
vector<int> dr(n);
for (int i = 0; i<n; i++) {
d[i] = a[i];
if (i == 0) continue;
if (d[i] < d[i - 1] + a[i]) {
d[i] = d[i - 1] + a[i];
}
}
for (int i = n - 1; i >= 0; i--) {
dr[i] = a[i];
if (i == n - 1) continue;
if (dr[i] < dr[i + 1] + a[i]) {
dr[i] = dr[i + 1] + a[i];
}
}
int ans = d[0];
for (int i = 1; i<n; i++) {
if (ans < d[i]) {
ans = d[i];
}
}
for (int i = 1; i<n - 1; i++) {
if (ans < d[i - 1] + dr[i + 1]) {
ans = d[i - 1] + dr[i + 1];
}
}
cout << ans << '\n';
return 0;
}