티스토리 뷰
이 문제는 LIS(Longest increasing subsequence) 기본 문제이다
문제를 푸는 방법은 현재 인덱스를 검사할때 그 전에 인덱스를 하나하나 살펴보면서 현재 인덱스에 있는 숫자 보다 작은 것의 인덱스 중에
가장 큰 dp값(가장 긴 부분증가수열)을 택하고 그것에 1을 더하면 현재 인덱스에서 가장 긴 부분 증가 수열을 구하게 된다.
예를 하나 들면
10 20 10 30 20 50 이 있을때
30에서 가장 긴 부분 증가수열을 구하려면(dp[3]에 들어가는 값)
30과 10 20 10 을 차례대로 비교를 해 나간다 그중에 10,20,10모두 30보다 작으므로 후보가 될 수 있다.
이 세 숫자 중에서 dp[0],dp[1],dp[2]에 저장된 값중에 가장 큰 것에 1을 더해주게되면 30에서의 가장긴 부분 증가 수열이다.
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 34 | #include <iostream> using namespace std; int input[1001]; int dp[1001]; int main() { int n; cin>>n; for(int i=0; i<n; i++) cin>>input[i]; dp[0] = 1; for(int i=0; i<n; i++) { int maxx = 0; for(int j=i-1; j>=0; j--) { if(input[i]>input[j]) { maxx = max(maxx,dp[j]); } } dp[i] = maxx+1; } int ret = -1; for(int i=0; i<n; i++) ret = max(dp[i],ret); cout<<ret<<endl; return 0; } | cs |
'알고리즘' 카테고리의 다른 글
[dfs/bfs/체감난이도 하] 2667번 단지번호붙이기 (0) | 2017.10.06 |
---|---|
백준 10757번 큰 수 A+B (0) | 2017.09.20 |
[백준/중상] 9935번 문자열 폭발 문제(스택+문자열 처리) (0) | 2017.08.31 |
[체감난이도/최하] 백준 10808번 알파벳 개수 (0) | 2017.08.28 |
[체감난이도/최하] 백준 1100번 하얀 칸 (0) | 2017.08.28 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- type alias
- await
- Babel
- mobx
- promise
- server side rendering
- state
- Next.js
- rendering scope
- es6
- computed
- props
- javascript
- async
- Action
- react hooks
- storybook
- reflow
- design system
- useEffect
- Polyfill
- typescript
- react
- reactdom
- hydrate
- useRef
- return type
- webpack
- atomic design
- reducer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함