문제
풀이 방법
예를 들어 설명 하겠다
ㅁㅁㅁㅁㅁㅁㅁㅁㅁ20ㅁㅁㅁㅁㅁ
이런식으로 있으면
20앞에 있는 수중 20보다 작은 가장 가까운 수가 있을것이다.
그렇다면 20까지 왔을때 가장 긴 증가하는 수열의 길이는
20보다 작은 가장 가까운 수의 +1 이 된다.
예를들어
10 20 10 30 20 50
에서 30까지 왔을때 30을 포함하는 가장 긴 수열의 길이는 30보다 작은 수중 가장 큰 수인
20에 +1을 한것이다.
코드
#include <iostream>
using namespace std;
int main()
{
int input;
cin >> input;
int arr[1001] = {0,};
int dp[1001] = {0,};
int i,j;
int min=0;
int maxv;
int max=0;
for (i = 0; i < input; i++) {
cin >> arr[i];
dp[i] = 0;
}
for (i = 0; i < input; i++) {
min = 0;
for (j = 0; j < i; j++) {
if (arr[j] < arr[i] && min < dp[j]) {
min = dp[j];
}
}
dp[i] = min + 1;
if (max < dp[i]) max = dp[i];
}
cout <<max;
return 0;
}
'알고리즘 > 다이나믹프로그래밍' 카테고리의 다른 글
백준1699 제곱수의 합 (0) | 2019.02.03 |
---|---|
백준1912 연속합 (0) | 2019.02.01 |
백준11057 오르막 수 (0) | 2019.01.30 |
백준1563 개근상 (0) | 2019.01.30 |
백준11052 카드 구매하기 (0) | 2019.01.25 |