algorithm/BOJ
BOJ 11055번 가장 큰 증가 부분수열
_JunHo
2020. 1. 7. 00:57
BOJ : https://www.acmicpc.net/problem/11055
GitHub : https://github.com/junho0956/Algorithm/blob/master/11055/11055/%EC%86%8C%EC%8A%A4.cpp
꼼꼼하지못하면 사람이 고생을 하는 것 같다.
저번 포스팅때 꼼꼼해지자 해놓고 또 덜렁대다 WA를 받은 문제이다.
다른분들은 어떤방식으로 풀었는지 참고해봐야 될 것 같다
생각해볼만한 요소는 이정도 인것 같다.
부분수열의 길이를 찾는 것이 아닌 부분수열의 합 중 가장 큰 값을 찾는 것이니,
DP를 이런식으로 구현해보았다.
현재 숫자로 가질 수 있는 최대값과 이때 현재 숫자를 동시에 저장해서 증가하는 부분수열을 찾아 값을 갱신시키자
(그래서 코드를 보면 2*1000으로 해놨는데
결국에는 현재 숫자를 동시에 저장한다는 것은 arr 배열을 참조했어도 된다.)
1 100 2 50 60 3 5 6 7 8 을 예로 들면
2중반복문을 이용해서 현재 비교할 값의 인덱스를 그 전인덱스까지 모두 비교해주면서
현재값보다 작은 값(arr)을 발견하면 그 인덱스의 DP 값과 비교하여 값을 채워나갔다.
* 전 인덱스까지 다 확인후에는 현재 값보다 작은 값이 없을 수도 있으므로
DP에는 현재값을 넣어주는 작업을 반드시 해야한다*
더보기
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
29
30
31
32
33
|
#include <iostream>
#include <algorithm>
using namespace std;
int arr[1001];
int dp[2][1001];
int N, Max, idx;
int main() {
ios::sync_with_stdio(false);
cin >> N;
for (int i = 0; i < N; i++) cin >> arr[i];
dp[0][0] = dp[1][0] = arr[0];
Max = dp[0][0];
for (int i = 1; i < N; i++) {
bool check = false;
for (int k = 0; k < i; k++) {
if (arr[i] > dp[1][k] && dp[0][k]+arr[i] > dp[0][i]) {
dp[0][i] = dp[0][k] + arr[i];
dp[1][i] = arr[i];
check = true;
}
Max = max(Max, dp[0][i]);
}
if (!check) dp[0][i] = dp[1][i] = arr[i];
}
cout << Max;
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
복습 20.02.09