문제출처: https://www.acmicpc.net/problem/11055
풀이
약 3주만에 알고리즘 문제를 다시 풀어보려는데 감이 많이 떨어져서 쉬운 문제를 찾다가 풀어본 문제입니다.
대충 문제를 읽고 dp문제같아서 dp로 풀었는데 맞았습니다.
arr[i]>arr[j]일 때 ( 앞의값보다 뒤의값이 클 때) dp[i]값을 갱신하는 식만 작성할줄 알면 될 것 같습니다.
코드
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 | #include<iostream> #include<algorithm> int arr[1001], dp[1001]; using namespace std; int main() { int n, sum = 0; cin >> n; for (int i = 0; i < n; i++) { cin >> arr[i]; //arr[i]값을 dp에 복사한다. dp[i] = arr[i]; //하나씩 비교해보며 가장 큰 증가부분수열구함 for (int j = 0; j <= i; j++) { // [1, 100, 2] 일 때 //증가수열이므로 무조건 뒷값이 앞값보다커야함 if (arr[i] > arr[j]) { //정답인dp[i]값을 갱신시켜나감 if (dp[i] < dp[j] + arr[i])dp[i] = dp[j] + arr[i]; } } //정답을 갱신시킴 sum = max(sum, dp[i]); } cout << sum << endl; } | cs |
결과
'문제풀이(BOJ) > 다이나믹 프로그래밍' 카테고리의 다른 글
[백준 16395] 파스칼의 삼각형 (0) | 2020.03.10 |
---|---|
[백준 1309] 동물원 (0) | 2020.01.09 |
[백준 1010] 다리 놓기 (0) | 2019.12.11 |
[백준 11052] 카드 구매하기 (0) | 2019.12.11 |
[백준 1912] 연속합 (0) | 2019.12.08 |