일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 구현
- 이분탐색
- 에라토스테네스의 체
- 그리디
- 정렬
- 플로이드와샬
- LazyPropagation
- 다익스트라
- DisjointSet
- 이분매칭
- 브루트포스
- BFS
- 이진탐색
- 크루스칼
- 비트마스크
- dfs
- 삼분탐색
- 투포인터
- 펜윅트리
- 누적합
- 백준
- 수학
- MST
- DP
- boj
- 세그먼트트리
- 위상정렬
- lis
- 좌표압축
- lca
Archives
- Today
- Total
lastknight00
[백준] 열차정렬(4198) 본문
문제 링크 : [백준] 열차정렬(4198)
문제 설명
n개의 서로다른 수로 이루어진 수열이 주어 질 때, 새로운 배열에 차례대로 수를 왼쪽에 붙이거나, 오른쪽에 붙이거나, 버리는 세가지 경우를 행하여, 만들 수 있는 수열 중 가장 긴 수열의 길이를 출력하세요.
입력
N(행렬의 길이, 1<=N<=2,000)
Di(i번째 수열의 수, 서로 모두 다름, 문제에는 빠져있으나, int 범위내로 가정하고 풀었을때 풀렸습니다.)
3
1
2
3
출력
가장 긴 수열의 길이
3
카테고리
#DP #LIS
시간 복잡도 상한
O(N2logN)
해결 방법
- 한 위치를 기준으로 가장 긴 증가하는 부분 수열(LIS)와 가장 긴 감소하는 부분 수열(LDS)를 구하면 되는 문제입니다.
- 단, 일반적인 LIS와는 다르게, LIS와 LDS의 시작지점이 같아야 합니다.
- 부분 수열들의 시작점을 고정해야되기 때문에, 인덱스의 진행은 역순으로 하는 것이 좋습니다.
시간복잡도
O(N2)
코드
#include<cstdio>
#include<algorithm>
using namespace std;
int n,d[2000],e[2000],f[2000],i,j,a;
int main(){
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",d+i);
for(i=n-1;i>=0;i--){
for(j=i+1;j<n;j++){
if(d[j]>d[i])e[i]=max(e[j],e[i]);
else f[i]=max(f[j],f[i]);
}
e[i]++;f[i]++;
a=max(a,e[i]+f[i]-1);
}
printf("%d",a);
}
'PS' 카테고리의 다른 글
[백준] 소수 사이 수열(3896) (0) | 2020.06.03 |
---|---|
[백준] 민균이의 계략(11568) (0) | 2020.06.02 |
[백준] 수조(2)(2130) (0) | 2020.06.01 |
[백준] 수조(1)(2130) (0) | 2020.06.01 |
[백준] 행렬 곱셈 순서(11049) (0) | 2020.06.01 |
Comments